10
GCC - o básico Vamos começar com o compilador... Eu espero que vocês saibam como compilar um código "na mão", isto é, sem "ctrl+f9" do seu IDE. Para aqueles qu não sabem, a sintaxe do gcc é: gcc [opções][arquivos][-o saída (opcional)] Algumas das opções mais utilizadas: -Idir --> adiciona um diretório "dir" onde o compilador procurará por #includes -Ldir --> adiciona um diretório "dir" onde o linker procurará por bibliotecas -larquivo --> Adiciona um bilioteca a linkagem (*.a, *.lib, *.so, *.dll...), se não for uma biblioteca "padrão", deve-se indicar o diretório onde ela se encontra, com -L Não é preciso escrever o "lib" nem a extensão do arquivo, suponha que você quer incluir a bilbioteca /home/eu/projetos/libteste.so O seu comando ficaria: gcc -L/home/eu/projetos -lteste -c --> apenas compila os objetos, não efetua a linkagem -g --> compila os objetos em debug mode, adicionando informações que permitem a utilização de um debugger. -Wopção --> SUA OPÇÃO PREFERIDA!!!, habilita os warnings (avisos) do compilador, são eles que te avisam onde estão os erros do seu código, te dizem até a linha... que moleza! Acho que para já está bom. Compilando um código

Gcc

Embed Size (px)

DESCRIPTION

GCC - o básico

Citation preview

Page 1: Gcc

GCC - o básico

Vamos começar com o compilador...Eu espero que vocês saibam como compilar um código "na mão", isto é, sem "ctrl+f9" do seu IDE.Para aqueles qu não sabem, a sintaxe do gcc é:

gcc [opções][arquivos][-o saída (opcional)]

Algumas das opções mais utilizadas:-Idir --> adiciona um diretório "dir" onde o compilador procurará por #includes

-Ldir --> adiciona um diretório "dir" onde o linker procurará por bibliotecas

-larquivo --> Adiciona um bilioteca a linkagem (*.a, *.lib, *.so, *.dll...), se não for uma biblioteca "padrão", deve-se indicar o diretório onde ela se encontra, com -LNão é preciso escrever o "lib" nem a extensão do arquivo, suponha que você quer incluir a bilbioteca /home/eu/projetos/libteste.soO seu comando ficaria: gcc -L/home/eu/projetos -lteste

-c --> apenas compila os objetos, não efetua a linkagem

-g --> compila os objetos em debug mode, adicionando informações que permitem a utilização de um debugger.

-Wopção --> SUA OPÇÃO PREFERIDA!!!, habilita os warnings (avisos) do compilador, são eles que te avisam onde estão os erros do seu código, te dizem até a linha... que moleza!

Acho que para já está bom.

Compilando um código

código: http://codepad.org/eOqb8tH6

#include <stdio.h>#include <stdlib.h>

typedef int TYPE;

typedef struct node{

TYPE data;struct node *next;

} node

//Acho que os nomes das funções são bem explicativos...void add_node(node** root, TYPE value);

Page 2: Gcc

void remove_node(node** root, node* n);node* find_node(node* root, TYPE value);void destroy_list(node** root);void print_list(node* root);

int main(){node* list = NULL;

add_node(&list, 1);add_node(&list, 2);add_node(&list, 3);add_node(&list, 4);add_node(&list, 5);add_node(&list, 6);add_node(&list, 7)add_node(&list, 8);add_node(&list, 9);

print_list(list);

fprintf(stdout, "\nVamos agora apagar alguns nós (7 e 8)...\n\n");

remove_node(list, find_node(list, 7));remove_node(&list, find_node(list, 8));

print_list(list);

fprintf(stdout, "\nVamos liberar a lista inteira...\n\n");

destroy_list(&list);

fprintf(stdout, (list == NULL)?("Lista liberada\n"):("algo correu mal...\n"));

return 0;

}

void add_node(node** root, TYPE value){

if ((*root) == NULL){

(*root) = (node*)malloc(sizeof(node));(*root)->data = value;(*root)->next = NULL;return;

}

node *curr = (*root);node *newnode = (node*)malloc(sizeof(node));

newnode->data = value;newnode->next = NULL;

Page 3: Gcc

#include <stdio.h>#include <stdlib.h>

typedef int TYPE;

typedef struct node{

TYPE data;struct node *next;

} node

//Acho que os nomes das funções são bem explicativos...void add_node(node** root, TYPE value);void remove_node(node** root, node* n);node* find_node(node* root, TYPE value);void destroy_list(node** root);void print_list(node* root);

int main(){node* list = NULL;

add_node(&list, 1);add_node(&list, 2);add_node(&list, 3);add_node(&list, 4);add_node(&list, 5);add_node(&list, 6);add_node(&list, 7)add_node(&list, 8);add_node(&list, 9);

print_list(list);

fprintf(stdout, "\nVamos agora apagar alguns nós (7 e 8)...\n\n");

remove_node(list, find_node(list, 7));remove_node(&list, find_node(list, 8));

print_list(list);

fprintf(stdout, "\nVamos liberar a lista inteira...\n\n");

destroy_list(&list);

fprintf(stdout, (list == NULL)?("Lista liberada\n"):("algo correu mal...\n"));

return 0;

}

void add_node(node** root, TYPE value){

if ((*root) == NULL){

Page 4: Gcc

(*root) = (node*)malloc(sizeof(node));(*root)->data = value;(*root)->next = NULL;return;

}

node *curr = (*root);node *newnode = (node*)malloc(sizeof(node));

newnode->data = value;newnode->next = NULL;

while (curr->next != NULL)curr = curr->next;

curr->next = newnode;}

void remove_node(node** root, node* n){node *curr = (*root);

if (n == NULL)return;

if ((*root) == n){

(*root) = (*root)->next;free(curr);return;

}

while (curr->next != n){

if (curr = NULL){

fprintf(stderr, "Node: not found in the list\n");

return;}

curr = curr->next;}

curr->next = n->next;

free(n);}

node *find_node(node* root, TYPE value){node *curr = root;

for (;; curr = curr->next){

if (curr->data == value)return curr;

Page 5: Gcc

if (curr == NULL){

fprintf(stderr, "value: %d not found in the list\n", value);

return NULL;}

}}

void destroy_list(node** root){node *curr = root;

while (curr != NULL){

curr = (*root);(*root) = (*root)->next;

free(curr);}

}

void print_list(node* root){node *curr = root;

while (curr != NULL){

fprintf(stdout, "[%x] %d\n", curr, curr->data);curr = curr->next;

}}

O que o compilador me disse:

Quote

victor@matrix:~/Desktop/tuto$ gcc -Wall -Wextra -g code.ccode.c:13: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘void’code.c:14: error: expected ‘)’ before ‘*’ tokencode.c:15: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ tokencode.c:16: error: expected ‘)’ before ‘*’ tokencode.c:17: error: expected ‘)’ before ‘*’ tokencode.c: In function ‘main’:code.c:22: error: ‘node’ undeclared (first use in this function)code.c:22: error: (Each undeclared identifier is reported only oncecode.c:22: error: for each function it appears in.)code.c:22: error: ‘list’ undeclared (first use in this function)code.c:24: warning: implicit declaration of function ‘add_node’code.c:31: error: expected ‘;’ before ‘add_node’code.c:34: warning: implicit declaration of function ‘print_list’code.c:38: warning: implicit declaration of function ‘remove_node’code.c:38: warning: implicit declaration of function ‘find_node’code.c:45: warning: implicit declaration of function ‘destroy_list’

Page 6: Gcc

code.c: At top level:code.c:53: error: expected ‘)’ before ‘*’ tokencode.c:75: error: expected ‘)’ before ‘*’ tokencode.c:105: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ tokencode.c:122: error: expected ‘)’ before ‘*’ tokencode.c:135: error: expected ‘)’ before ‘*’ token

Notem nas opções que utilizei para compilar o código:-Wall: dizendo o compilador para mostrar TODOS os warnings-Wextra: pedindo ainda os warnings extra-g: debug mode.

E notem que o compilador me falou TUDO que estava errado no código...A nomenclatura é muito simples:

<nome_do_arquivo>:<número_da_linha>:<error ou warning>: o que você fez de errado

Depois de seguir as mensagens dele, temos outro código:http://codepad.org/tlQGsL0t

#include <stdio.h>#include <stdlib.h>

typedef int TYPE;

typedef struct node{

TYPE data;struct node *next;

} node;

//Acho que os nomes das funções são bem explicativos...void add_node(node** root, TYPE value);void remove_node(node** root, node* n);node* find_node(node* root, TYPE value);void destroy_list(node** root);void print_list(node* root);

int main(){node* list = NULL;

add_node(&list, 1);add_node(&list, 2);add_node(&list, 3);add_node(&list, 4);add_node(&list, 5);add_node(&list, 6);add_node(&list, 7);add_node(&list, 8);add_node(&list, 9);

print_list(list);

Page 7: Gcc

fprintf(stdout, "\nVamos agora apagar alguns nós (7 e 8)...\n\n");

remove_node(&list, find_node(list, 7));remove_node(&list, find_node(list, 8));

print_list(list);

fprintf(stdout, "\nVamos liberar a lista inteira...\n\n");

destroy_list(&list);

fprintf(stdout, (list == NULL)?("Lista liberada\n"):("algo correu mal...\n"));

return 0;

}

void add_node(node** root, TYPE value){

if ((*root) == NULL){

(*root) = (node*)malloc(sizeof(node));(*root)->data = value;(*root)->next = NULL;return;

}

node *curr = (*root);node *newnode = (node*)malloc(sizeof(node));

newnode->data = value;newnode->next = NULL;

while (curr->next != NULL)curr = curr->next;

curr->next = newnode;}

void remove_node(node** root, node* n){node *curr = (*root);

if (n == NULL)return;

if ((*root) == n){

(*root) = (*root)->next;free(curr);return;

}

while (curr->next != n){

if (curr == NULL){

fprintf(stderr, "Node not found in the list\n");

Page 8: Gcc

return;}

curr = curr->next;}

curr->next = n->next;

free(n);}

node *find_node(node* root, TYPE value){node *curr = root;

for (;; curr = curr->next){

if (curr->data == value)return curr;

if (curr == NULL){

fprintf(stderr, "value: %d not found in the list\n", value);

return NULL;}

}}

void destroy_list(node** root){node *curr = (*root);

while (curr != NULL){

curr = (*root);(*root) = (*root)->next;

free(curr);}

}

void print_list(node* root){node *curr = root;

while (curr != NULL){

fprintf(stdout, "[%x] %d\n", (unsigned int)curr, curr->data);

curr = curr->next;}

}

Ao compilar esse novo código.... tcharaaaam! nenhum erro, nem warning! maravilha!!

Mas e ao executar o programa?