gcc - compile! linque! debug!

69
GCC Compile! Linque! Debug! E mais! John Henrique Teixeira de Godoi Mathias Felipe Lima Santos Instituto de Ciˆ encias e Tecnologia Universidade Federal de S˜ ao Paulo ao Jos´ e dos Campos – SP, Brasil Novembro, 2011 Programa de Educa¸ ao em Software Livre - PESL

Upload: peslpinguim

Post on 05-Jul-2015

1.584 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: GCC - Compile! Linque! Debug!

GCCCompile! Linque! Debug! E mais!

John Henrique Teixeira de GodoiMathias Felipe Lima Santos

Instituto de Ciencias e TecnologiaUniversidade Federal de Sao PauloSao Jose dos Campos – SP, Brasil

Novembro, 2011

Programa de Educacao em Software Livre - PESL

Page 2: GCC - Compile! Linque! Debug!

Avisos!

Esse material foi elaborado para o vıdeo que deve ser entreguena disciplina de multimıdia.

Algumas traducoes podem nao ser fieis mas se adequavammelhor ao contexto.

Alem do conteudo desses slides tem a parte pratica que seraexibida durante a apresentacao.

Algumas bibliotecas e configuracees podem ser necessariaspara a execucao de alguns exemplos, como GNU DatabaseManagement Library (GDBM).

A biblioteca GDBM armazena pares devalores-chaves em um arquivo DBM, um tipo dearquivos de dados que permite armazenar eindexar por uma chave.

Page 3: GCC - Compile! Linque! Debug!

Indice1 GCC – C/C++

GCCProgramando em C e C++

2 Compilar!Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

3 Vincular!Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

4 E mais!Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Page 4: GCC - Compile! Linque! Debug!

Indice1 GCC – C/C++

GCCProgramando em C e C++

2 Compilar!Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

3 Vincular!Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

4 E mais!Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Page 5: GCC - Compile! Linque! Debug!

Indice1 GCC – C/C++

GCCProgramando em C e C++

2 Compilar!Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

3 Vincular!Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

4 E mais!Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Page 6: GCC - Compile! Linque! Debug!

Indice1 GCC – C/C++

GCCProgramando em C e C++

2 Compilar!Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

3 Vincular!Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

4 E mais!Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Page 7: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

GCCProgramando em C e C++

Uma breve historia do GCC

Criador do GNU C Compiler (GCC) e Richard Stallman,quefundou o projeto GNU, em 1984, para criar um sistemaoperacional, baseado em Unix, como software livre.

Precisava de um compilador C, e devido a falta decompiladores livres naquela epoca, criou-se um do zero.

1olancamento do GCC em 1987, sendo o primeiro compiladorotimizador ANSI C portatil lancado como software livre.

1992, foi adicionado a capacidade de compilar C++

2001, adicionado melhorias na otimizacao e no suporte aoC++

Suporte para linguagens adicionais como:Fortran, ADA, Java and Objective-C.

E a sigla GCC, agora, se refere a “GNU Compiler Collection”.

John Godoi, Mathias Santos GCC

Page 8: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

GCCProgramando em C e C++

Principais funcionalidades do GCC

GCC e um compilador portavel que roda na maioria dasplataformas disponıveis atualmente, e criar saıdas para diferentestipos de processadores (PC, microcontrollers, DSPs e CPUs64-bits). GCC permite compilar um programa para diferentesplataformas, produzindo arquivos executaveis para diferentessistemas a partir de qualquer outro com GCC. GCC e escrito em Ccom um forte foco na portabilidade, e pode se auto-compilar, paraque seja adaptado a novos sistemas facilmente.

John Godoi, Mathias Santos GCC

Page 9: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

GCCProgramando em C e C++

Principais funcionalidades do GCC

GCC tem uma arquitetura modular, permitindo suporte para novaslinguagens e arquiteturas a serem adicionadas. Adicionando umanova linguagem ao GCC permite o uso dessa linguagem emqualquer arquitetura. Finalmente, e mais importante, GCC e umsoftware livre, distribuıdo sob a GNU General Public License (GNUGPL).O que significa que voce tem a liberdade para usa-lo, altera-lo,assim como outros software GNU.

John Godoi, Mathias Santos GCC

Page 10: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

GCCProgramando em C e C++

Programando em C e C++

C e C++ sao linguagens que permitem acesso direto amemoria do computado.

Usadas para escrever sistemas de baixo nıvel, e aplicacoesonde alta-perfomance e controle dos recurso usados saocrıticos.

Exigem um cuidado com o acesso correto memoria, paraevitar corromper outras estruturas de dados.

Existem tecnicas, usando GCC por exemplo, que ajudam adetectar provaveis erros durante a compilacao, mas que naoeliminam o “risco ” de usar tais linguagens.

John Godoi, Mathias Santos GCC

Page 11: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

Compilando um programa em C

Podemos compilar programas a partir de um unico arquivo, ou devarios outros, e tambem podemos usar bibliotecas do sistema earquivos de cabecalho. Compilacao trata-se do processo deconverte um programa de um codigo fonte em texto, em umalinguagem tal como C ou C++, em um codigo de maquina, umasequencia de 1’s e 0’s usados para controla a Unidade Central deprocessamento (CPU) do computador. Esse codigo e armazendoem um arquivo tambem conhecido como arquivo executavel, oubinario.

John Godoi, Mathias Santos GCC

Page 12: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

Compilando um programa simples em C

Usaremos o exemplo classico, Hello World, como exemplo deprograma em linguagem C.//nome do arquivo: hello.c# include <<stdio.h>>

int main (void){printf (“Hello,world!\n′′);return 0;}

John Godoi, Mathias Santos GCC

Page 13: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

Compilando um programa simples em C

Para compilar ‘hello.c’: “$ gcc -Wall hello.c -o hello” O arquivode saıda e definido usando o parametro ‘-o’. Se omitido, a saıda eescrita em um arquivo chamado ‘a.out’. O parametro ‘-Wall’ativaos avisos para os erros mais comuns ainda na compilacao -recomenda-se sempre use esse parametro! Para executar oprograma, digite o caminho do executavel assim: “$ ./hello” Oque carregara o arquivo executavel na memoria e fara a CPUexecutar as instrucoes contidas nele.

John Godoi, Mathias Santos GCC

Page 14: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

Encontrando erros em um programa simples

Exemplo, ‘printf’com formato de ponto flutuante, ‘%f’, usado paraimprimir um valor inteiro:# include <<stdio.h>>

int main (void){printf (“Twoplustwois%f \n′′, 4);return 0;}Um erro que pode passar despercebido primeira vista, masdetectado se o parametro ‘-Wall’estiver acionado.

John Godoi, Mathias Santos GCC

Page 15: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

Encontrando erros em um programa simples

Ao compilar o codigo acima, o gcc lanca um aviso com a seguintemensagem:“$ gcc -Wall bad.c -o bad”“bad.c: In function ‘main’:”“bad.c:6: warning: double format, different type arg (arg2)”O que indica o uso incorreto de formato no ‘printf’, na linha 6.As mensagens produzidas pelo GCC sempre seguem o modelo -arquivo:numero da linha:mensagem.

John Godoi, Mathias Santos GCC

Page 16: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

Encontrando erros em um programa simples

O compilador e capaz de distinguir entre as mensagens de erro, oque previne compilar um codigo com problemas, e de aviso queindicam possıveis problemas, nao causariam problemas nacompilacao. Nesse caso, o formato correto seria ‘%d’.Sem o parametro ‘-Wall’o programa aparentemente compilarnormalmente, mas produz uma saıda incorreta:“$ gcc bad.c -o bad”“$ ./bad”“Two plus two is 2.585495 (saida incorreta)”

John Godoi, Mathias Santos GCC

Page 17: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

Encontrando erros em um programa simples

Numeros inteiros e pontos flutuantes sao armazenados de formadiferentes na memoria, e costumam ocupar quantidades de bytesdiferentes, causando saıdas incorretas. Alem de gerar saıdasincorretas, funcoes que nao sao usadas corretamente podem causara falha do programa, e para prevenir possıveis problemas eaconselhavel verificar os avisos do compilador. Obs.: O parametro‘-Wall’e capaz de identificar os erros que comumente ocorrem emC.

John Godoi, Mathias Santos GCC

Page 18: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

Compilando a partir de varios arquivos

Programa divididos em varios arquivos:

codigo mais facil de editar e entender (codigosgrandes)

compilar separadamente cada arquivos

Exemplo, ‘Hello World’dividido nos arquivos ‘main.c’, ‘hello fn.c’eo cabecalho ‘hello.h’.//main.c# include “hello.h ”

int main (void) {hello (“world“);return 0;}

John Godoi, Mathias Santos GCC

Page 19: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

Compilando a partir de varios arquivos

A chamada da funcao printf e feita atraves de uma funcao externa,hello( ), definida em ‘hello fn.c’. O programa ‘main’tambem incluio cabecalho ‘hello.h’que contem a declaracao da funcao hello( ).A declaracao e usada para garantir que os tipos da funcaochamada combinam com a funcao definida.Como a funcao main nao chama a funcao ‘printf’diretamente, naoha necessidade incluir a biblioteca ‘stdio.h’no ‘main.c’.//hello.hvoid hello (const char ∗ name);

John Godoi, Mathias Santos GCC

Page 20: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

Compilando a partir de varios arquivos

//hello fn.c# include <<stdio.h>>

# include “hello.h ”void hello (const char ∗ name) {printf (“Hello,%s!\n“, name);}Observamos que existem duas formas usar a instrucao # include,no caso de # include “FILE.h ”, para indexar a biblioteca e feitaum procura pelo arquivo no diretorio atual, entao busca-se nosdiretorios do sistema.E para # include <<FILE.h>>a busca pelo arquivo e feita apenasnos diretorios do sistema.

John Godoi, Mathias Santos GCC

Page 21: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

Compilando a partir de varios arquivos

Para compilar:“$ gcc -Wall main.c hello fn.c -o newhello”Obs.: O arquivo cabecalho, ‘hello.h’, nao foi incluıdo na lista dearquivos. A diretiva # include “hello.h ” no codigo-fonte instrue ocompilador para incluı-lo automaticamente aonde e necessario.Para executar:“$ ./newhello”“Hello, world!”

John Godoi, Mathias Santos GCC

Page 22: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

Compilando os arquivos separadamente

Ao realizar uma mudanca qualquer em uma funcao separada: Numunico arquivo:o programa inteiro deve ser recompilado,pode ser um processo lento Codigos em arquivos diferentes:somente os arquivos que possuem mudancas precisam serrecompilados. Os arquivos-fonte sao compilados separadamente eentao vinculados - um processo de duas fases.

John Godoi, Mathias Santos GCC

Page 23: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

Compilando os arquivos separadamente

1 Na 1aetapa:um arquivo e compilado sem criar umexecutavel.O resultado e referenciado como umarquivo objeto que tem a extensao ‘.o’quandousando GCC.

2 Na 2aetapa:O Lincador combina todos os arquivos objetospara criar um unico executavel.

John Godoi, Mathias Santos GCC

Page 24: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Compilando um programa em CEncontrando erros em um programa simplesCompilando a partir de varios arquivos

Compilando os arquivos separadamente

Em um arquivo objeto temos o codigo de maquina sem referenciaspara enderecos de memoria das funcoes (ou variaveis) em outrosarquivos, que ficam indefinidosIsso permite que os codigos fontes sejam compilados sem umareferencia direta entre esses. O lincados preenche os enderecosrestantes quando produz o executavel.

John Godoi, Mathias Santos GCC

Page 25: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Criando arquivos objetos de codigo-fontes

O parametro ‘-c’e usado para compilar um codigo-fonte para umarquivo objeto. Por exemplo, o seguinte comando ira compilar ocodigo-fonte ‘main.c’para um arquivo objeto:“$ gcc -Wall -c main.c”Isso produz um arquivo objeto ‘main.o’contem o codigo demaquina para a funcao main. Contem a refencia para funcaoexterna hello, mas o endereco de memoria e deixado indefinido noarquivo objeto nesse estagio (queserapreenchidopelolincador).

John Godoi, Mathias Santos GCC

Page 26: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Criando arquivos objetos de codigo-fontes

O comando que corresponde a compilar o codigo fonte da funcaohello em ‘hello fn.c’e:“$ gcc -Wall -c hello fn.c”Isso produz um arquivo objeto ‘hello fn.o’.Perceba que nao existe necessidade de usar o parametro ‘-o’paraespecificar o nome do arquivo de saıda nesse caso. Quandocompilando com ‘-c’o compilador automaticamente cria umarquivo objeto que o nome e o mesmo do codigo-fonte, com‘.o’diferente da extensao original.Nao ha necessidade de inserir o arquivo cabecalho ‘hello.h’na linhade comando, pois ja e incluido automaticamenteo pelos comandos# include no ‘main.c’e ‘hello fn.c’.

John Godoi, Mathias Santos GCC

Page 27: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Criando executaveis a partir de arquivos objetos

O passo final em criar um arquivo executavel e usar o gcc paravincular os arquivos objetos e preencher os enderecos das funcoesexternas que faltam. Para vincular os arquivos objetos, eles saosimplesmente listados na linha de comando:“$ gcc main.o hello fn.o -o hello”Esse e um dos poucos casos onde nao existe a necessidade do usodo parametro de aviso ‘-Wall’, ja que os codigos-fontes foramseparadamente compilados com sucesso para arquivos objetos.Uma vez que os codigos fontes foram compilados, vincular e umprocesso desambigo pode falhar ou nao, e so falhara se existiremreferencias que nao poderem ser resolvidas.

John Godoi, Mathias Santos GCC

Page 28: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Criando executaveis a partir de arquivos objetos

Para realizar o passo de vinculacao o gcc usar o vinculador ld, quee um programa separado. Em sistemas GNU e usado o GNU ld.Outros sistemas podem usado o GNU linker com o GCC, oupodem usar seus proprios vinculadores.Ao rodar o vinculador, o gcc cria um arquivo executavel a partirdos arquivos objetos.O arquivos executavel pode ser rodado por:“$ ./hello”“Hello, world!”Produzindo a mesma saıda da versao que utiliza um unico arquivo.

John Godoi, Mathias Santos GCC

Page 29: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Ordem para vincular os arquivos objetos

Em sistemas derivados do Unix, o comportamento tradicional devinculadores e compilados e procurar por funcoes externas daesquerda para a direita nos arquivos objetos especificados na linhade comando. Isso significa que o arquivo obejto que contem adefinicao de uma funcao deveria aparecer depois de alguns aruivosque chamaram aquela funcao.Nesse caso, o arquivo ‘hello fn.o’contem hello que deveria serespecificado depois de ‘main.o’, ja que main chama hello:“$ gcc main.o hello fn.o -o hello” (ordem correta)

John Godoi, Mathias Santos GCC

Page 30: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Ordem para vincular os arquivos objetos

Com alguns compiladores ou vinculadores a ordem inversaproduziria um erro,“$ cc hello fn.o main.o -o hello (ordemincorreta)”“main.o: In function ‘main’:”“main.o(.text + 0xf ): undefined reference to ‘hello’”por nao ha nenhum arquivo obejto contendo hello depois de‘main.o’.

John Godoi, Mathias Santos GCC

Page 31: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Ordem para vincular os arquivos objetos

Mas atualmente compiladores e vinculadores irao buscar em todosarquivos objetos, mesmo fora de ordem, mas como nem todoscompildadores fazem isso e melhor seguir a ordem convencionaldos arquivos objetos da esquerda para a direita.Assim vale a pena manter isso na mente caso voce encontreproblemas imprevistos com referencias indefinidas, e todos osarquivos objetos estao presentes na linha de comando.

John Godoi, Mathias Santos GCC

Page 32: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Recompilando e revinculando

Para mostrar como os codigos-fontes podem ser compiladosindependentemente nos iremos editar o programa main ‘main.c’emodifica-lo para mostrar uma saudacao para todos ao inves domundo:# include “hello.h ”

int main (void){hello (“everyone“); // mudado de “world”return 0;}

John Godoi, Mathias Santos GCC

Page 33: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Compilando os arquivos separadamente

O arquivo atualizado ‘main.c’pode agora ser recompilado com oseguinte comando:“$ gcc -Wall -c main.c”Isso produzira um novo arquivo objeto ‘main.o’. Nao hanecessidade de criar um novo arquivo objeto para ‘hello fn.c’, jaque seu arquivo e dependentes, tais como arquivos cabecalhos, naosofreram alteracoes.

John Godoi, Mathias Santos GCC

Page 34: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Recompilando e revinculando

O novo arquivo objeto pode ser revinculado com a funcao hellopara criar um novo executavel:“$ gcc main.o hello fn.o -o hello”O executavel resultante ‘hello’agora usa a nova funcao main paraproduzir a seguinte saıda:“$ ./hello”“Hello, everyone!”Note que somente o arquivo ‘main.c’foi recompilado e entaorevinculado com os arquivos objetos existentes para a funcao hello.

John Godoi, Mathias Santos GCC

Page 35: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Vinculando com bibliotecas externas

Uma biblioteca e uma colecao de arquivos objetos precompiladosque podem ser vinculados em programas.O uso mais comum de bibliotecas e para prover funcoes dosistemas, tal como a funcao de raiz quadrada sqrt encontrada nana biblioteca do C “math”.Bibliotecas sao tipicamente arqmazenadas em arquivos especiaiscom a extensao ‘.a’, referenciadas como bibliotecas estaticas. Elassao criadas arquivos objetos com ferramentas separadas do gcc,como o GNU archiver ar, e usado pelo vinculador para resolverreferencias a funcoes no tempo de compilacao.

John Godoi, Mathias Santos GCC

Page 36: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Vinculando com bibliotecas externas

As bibliotecas padroes do sistema sao normalmente encontradasnos diretorios ‘/usr/lib’e ‘/lib’. Por exemplo, a biblioteca math enormalmente armazenada no arquivo ‘/usr/lib/libm.a’em sistemasbaseados no Unix.O prototipo das correspondentes declaracoes para as funcoes nessabiblioteca pode ser encontrado no arquivo de cabecalho‘/usr/include/math.h’. A biblioteca padrao do proprio C earqmazenada em ‘/usr/lib/libc.a’e contem funcoes especificadasno padrao ANSI/ISO C, tais como ‘printf’– essa biblioteca evinculada por padrao para todos os programas em C.

John Godoi, Mathias Santos GCC

Page 37: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Vinculando com bibliotecas externas

Exemplo de programa que chama uma funcao externa sqrt nabiblioteca math ‘libm.a’:# include <<math.h>>

# include <<stdio.h>>int main (void) {double x = sqrt (2.0);printf (“The square root of 2.0 is %f \ n′′, x);return 0;}

John Godoi, Mathias Santos GCC

Page 38: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Vinculando com bibliotecas externas

Ao tentar criar um executavel de codigo fonte sozinho o compiladoda como saıda um erro no estagio de vinculacao:“$ gcc -Wall calc.c -o calc”“/tmp/ccbR6Ojm.o: In function ‘main’:”“/tmp/ccbR6Ojm.o(.text + 0x19): undefined reference to‘sqrt’”

John Godoi, Mathias Santos GCC

Page 39: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Vinculando com bibliotecas externas

O problema e que a referencia para a funcao sqrt nao pode serresolvida sem a biblioteca externa math ‘libm.a’. A funcao sqrtnao e definida no programa ou na biblioteca padrao ‘libc.a’, e ocompilador nao vincula o arquivo ‘libm.a’ao menos que sejaexplicitamente selecionado. A proposito, o arquivo mencionado namensagem de erro ‘/tmp/ccbR60jm.o’e um arquivo objetotemporario criado pelo compilador a partir do ‘calc.c’, a fim detentar realizar o processo de vinculacao.

John Godoi, Mathias Santos GCC

Page 40: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Vinculando com bibliotecas externas

Para habilitar o compilador vincular a funcao sqrt ao programamain em ‘calc.c’nos precisamos fornecer a biblioteca ‘libm.a’. Umaforma obvia de realizar isso e especificar explicitamente na linha decomando:“$ gcc -Wall calc.c /usr/lib/libm.a -o calc”A biblioteca ‘libm.a’contem os arquivos objetos para todas afuncoes matematicas, tais como sin, cos, exp, log e sqrt. Ovinculador procura por esse para achar o arquivo objeto contendo afuncao sqrt.

John Godoi, Mathias Santos GCC

Page 41: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Vinculando com bibliotecas externas

Uma vez que o arquivo objeto para a funcao sqrt e encontrado, oprograma main pode ser vinculado e produzir o executavelcompleto:“$ ./calc”“The square root of 2.0 is 1.414214”O arquivo executavel inclue o codigo de maquina para a funcaomain e o codigo de maquina para a funcao sqrt, copiado docorrespondente arquivo objeto na biblioteca ‘libm.a’.

John Godoi, Mathias Santos GCC

Page 42: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Vinculando com bibliotecas externas

Para evitar ter que especificar longos caminhos na linha decomando, o compilador disponibilizar uma opcao de atalho ‘-l’paravincular bibliotecas. Por exemplo o seguinte comando,“$ gcc -Wall calc.c -lm -o calc”e equivalente ao original comando anterior usando o nomecompleto da biblioteca ‘/usr/lib/libm.a’.Em geral, o parametro ‘-lNAME ‘anexara arquivos objetos com oarquivo da biblioteca ‘libNAME.a’nos diretorios padrees.Adicionalmente diretorios podem ser especificados com parametrosna linha de comando ou variaveis de ambiente.

John Godoi, Mathias Santos GCC

Page 43: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Ordem de vinculacao das bibliotecas

A ordem das bibliotecas na linha de comando segue a mesmaconvecao dos arquivos objetos: eles sao buscado da esquerda paraa direita – uma biblioteca contendo a definicao de uma funcaodeveria aparecer depois de qualquer arquivo fonte ou arquivosobjetos que a usem. Isso inclue biblioteca especificadas com oparametro de atalho‘-l’, como vemos no comando a seguir:“$ gcc -Wall calc.c -lm -o calc (correto)”

John Godoi, Mathias Santos GCC

Page 44: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Ordem de vinculacao das bibliotecas

Ao tentar compilar, colocando ‘-lm’antes do arquivo que a usa,resultara no erro:“$ cc -Wall -lm calc.c -o calc (incorreto)”“main.o: In function ‘main’:”“main.o(.text + 0xf ): undefined reference to ‘sqrt’becausethere is no library or object file containing sqrt after ‘calc.c’.”

John Godoi, Mathias Santos GCC

Page 45: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Codigo-fontes → arquivos objetos → executaveisOrdem para vincular os arquivos objetosRecompilando e revinculandoVinculando com bibliotecas externasOrdem de vinculacao das bibliotecas

Ordem de vinculacao das bibliotecas

Quando diversas bibliotecas sao usadas, a mesma convecao deveriaser seguida pelas proprias. Uma biblioteca que chama uma funcaoexterna definada em outra biblioteca apareceria antes da bibliotecacontendo a funcao.Por exemplo, um programa ‘data.c’usando a biblioteca GNU LinearProgramming ‘libglpk.a’, que por sua vez usa a biblioteca math‘libm.a’, deveria ser compilado como,“$ gcc -Wall data.c -lglpk -lm”ja que os arquivos objetos em ‘libglpk.a’usam funcees definada em‘libm.a’.

John Godoi, Mathias Santos GCC

Page 46: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Usando bibliotecas de arquivos cabecalhos

Ao usar uma biblioteca e essencial incluir arquivo cabecalhosapropriados, em ordem ao declarar os argumentos de funcees e osvalores de retorno com os tipos corretos. Sem declaracees, osargumentos de uma funcao podem ser passado com tipo errado,causando resultados adulterados.O proximo exemplo mostrar outro programa que faz uma funcaochamar a biblioteca math do C.

John Godoi, Mathias Santos GCC

Page 47: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Usando bibliotecas de arquivos cabecalhos

Nesse caso, a funcao pow e usada para calcular o cubo de 2.# include <<stdio.h>>

int main (void) {double x = pow (2.0, 3.0);printf (“Twocubedis%f \n′′, x);return 0;}

John Godoi, Mathias Santos GCC

Page 48: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Usando bibliotecas de arquivos cabecalhos

Entretanto, o programa contem um erro – o comando # includepara ‘math.h’esta faltando, entao o prototipo double pow(doublex , doubley) dado nao sera encontrado pelo compilador.Compilando o programa sem qualquer parametros para avisosproduzira um arquivo executavel que gerara resultados incorretos:“$ gcc badpow.c -lm”“$ ./a.out (resultado incorreto, deveria ser 8)”“Two cubed is 2.851120”Os resultados sao adulterados porque os argumentos e o valor deretorno da chamada pow sao passados com tipos incorretos.

John Godoi, Mathias Santos GCC

Page 49: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Usando bibliotecas de arquivos cabecalhos

O que poderia ser detectado acionando o parametro ‘-Wall’:“$ gcc -Wall badpow.c -lm”“badpow.c: In function ‘main’:”“badpow.c:6: warning: implicit declaration of function‘pow’(naoencontrouprototipodepow)Prova de que o uso do parametro de aviso ‘-Wall’detecta diversosproblemas que poderiam ser ignorados.

John Godoi, Mathias Santos GCC

Page 50: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Parametros de compilacao

Essas parametros controlam funcionalidades tais como busca decaminhos usados para localizacao de bibliotecas e arquivosincluıdos, o uso adicional de avisos e diagnosticos, prepocessadorde macros e dialetos do C.Um problema comum quando compilando um programa que usaarquivos cabecalhos para bibliotecas e o erro:FILE.h : No such file or directory (arquivo nao encontrado)Isso ocorre se um arquivo de cabecalho nao esta presente nosdiretorios de arquivos padrees usados pelo gcc.

John Godoi, Mathias Santos GCC

Page 51: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Parametros de compilacao

Um problema similar pode ocorre para bibliotecas:/usr/bin/ld: cannot find library (biblioteca nao encontrada)Isso acontece se a biblioteca usada para vinculacao nao estapresente nos diretorios padrees usados pelo gcc.Por padrao, o gcc busca por arquivos de cabecalhos nos seguintesdiretorios:/usr/local/include//usr/include/e os nos seguintes diretorios para bibliotecas:/usr/local/lib//usr/lib/

John Godoi, Mathias Santos GCC

Page 52: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Parametros de compilacao

A lista de de diretorios para cabecalhos e frequentementereferenciada para caminho para inclusao, e a lista de diretoriospara bibliotecas como diretorio de busca ou caminho de vınculo.Os diretotios nesses caminhos sao buscados em ordem, do primeiroao ultimo nas duas listas acima. Por exemplo, um arquivo decabecalho encontrado em ‘/usr/local/include’tem precedencia emrelacao ao um arquivo com mesmo nome em ‘/usr/include’.Similarmente, uma biblioteca encontrada em ‘/usr/local/lib’ temprecedencia em relacao a outra com mesmo nome em ‘/usr/lib’.

John Godoi, Mathias Santos GCC

Page 53: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Parametros de compilacao

Os caminhos padrees de busca podem tambem incluir adicionaisdependendo do sistema ou local especıfico dos diretorios, e osdiretorios na instalacao do GCC mesmo.Por exemplo, em plataformas 64-bit ‘lib64’diretorios adicionaispodem ser buscado por padrao.Quando bibliotecas adicinais sao instaladas em outros diretorios enecessario extender os caminhos de busca, de forma que asbibliotecas sejam achadas.Os parametros do compilador ‘-I’e ‘-L’adicionam novos diretoriosao inıcio do caminho de inclusao e busca de bibliotecasrespectivamente.

John Godoi, Mathias Santos GCC

Page 54: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Parametros de compilacao

O programa ‘dbmain.c’, que cria um arquivo DBM contendo umachave ‘testkey’com o valor ‘testvalue’:# include <<stdio.h>>

# include <<gdbm.h>>int main (void) {GDBM FILE dbf;datum key = “testkey ”, 7 ; //key, lengthdatum value = “testvalue ”, 9 ; //value, lengthprintf (“Storingkey − valuepair ...“);dbf = gdbm open (“test ′′, 0,GDBM NEWDB, 0644, 0);gdbm store (dbf , key , value,GDBM INSERT );gdbm close (dbf );printf (“done.\n′′);return 0; }

John Godoi, Mathias Santos GCC

Page 55: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Parametros de compilacao

O programa usa um arquivo de cabecalho ‘gdbm.h’e uma biblioteca‘libgdbm.a’. Se a biblioteca foi instalada na localizacao padrao de‘/usr/local/lib’, com o arquivo cabecalho em ‘/usr/local/include’,entao o programa pode ser compilado com o seguinte comando:“$ gcc -Wall dbmain.c -lgdbm”Ambos diretorios sao parte dos caminhos de vınculos e inclusaopadrees.Entretanto, se GDBM foi instalado em uma localizacao diferente,tentar compilar o programa ira dar o seguinte erro:“$ gcc -Wall dbmain.c -lgdbm”“dbmain.c:1: gdbm.h: No such file or directory”

John Godoi, Mathias Santos GCC

Page 56: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Parametros de compilacao

Por exemplo, se a versao 1.8.3 do pacote GDBM esta instalado nodiretorio ‘/opt/gdbm-1.8.3’a localizacao do cabecalho poderia ser,/opt/gdbm-1.8.3/include/gdbm.h que nao e parte dos caminhosde inclusao padrees. Adicionando os diretorio aproprioado aocaminho de inclusao com o comando ‘-I’permite que o programaseja compilado, mas nao vinculado:“$ gcc -Wall -I/opt/gdbm-1.8.3/include dbmain.c -lgdbm”“/usr/bin/ld: cannot find -lgdbm”“collect2: ld returned 1 exit status”O diretorio contendo a biblioteca ainda esta faltando no caminhode vınculo. Ele pode ser adicionado usando o seguinte parametros:“-L/opt/gdbm-1.8.3/lib/”

John Godoi, Mathias Santos GCC

Page 57: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Parametros de compilacao

A seguinte linha de comando permite que o programa sejacompilado e vinculado:“$ gcc -Wall -I/opt/gdbm-1.8.3/include-L/opt/gdbm-1.8.3/lib dbmain.c -lgdbm”Isso produz o executavel final vinculado a biblioteca GCBM.

John Godoi, Mathias Santos GCC

Page 58: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Padroes da linguagem C

Por padrao, o gcc compila programas usando o dialeto GNU dalinguagem C, referenciado como GNU C. Esse dialeto incorpora opadrao oficial ANSI/ ISO para a linguagem C com diversasextensees uteis do GNU, tais como funcees aninhadas e vetores detamanho dinamico. A maioria dos programas ANSI/ ISOcompilarao sob o GNU C sem problemas.Existem diversos parametros que controlam o dialeto do C usadopelo gcc.Os mais comumente usados sao ‘-ansi’e ‘-pedantic’.

John Godoi, Mathias Santos GCC

Page 59: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Padroes da linguagem C

O especifıcio dialeto para a linguagem C para cada padrao podetambem ser selecionado com o parametro ‘-std’.Ocasionalmente um programa ANSI/ ISO valido pode serincompatıvel com as extensees GNU C. Para lidar com essasituacao, o parametros do compilador ‘-ansi’desabilita aquelasextensees GNU que tiverem conflito com o padrao ANSI/ ISO. Emsistemas usando a biblioteca GNU C (glibc) pode-se tambemdesabilitar a biblioteca padrao do C. Isso permite que os programassejam escritos em ANSI/ ISO C sejam compilados sem efeitosindesejaveis das extensees do GNU.

John Godoi, Mathias Santos GCC

Page 60: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Padroes da linguagem C

Por exemplo, o programa ANSI/ ISO C que usa uma variavelchamada asm:# include <<stdio.h>>

int main (void) {const char asm[]= “6502 ”;printf (“thestringasmis‘%s ′\n′′, asm);return 0;}

John Godoi, Mathias Santos GCC

Page 61: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Padroes da linguagem C

A variavels asm e valida sob o padrao ANSI/ ISO, mas esseprograma nao sera compilado no GNU C porque asm e um palavrachave para a extensao GNU C, o que permite usar instruceesassembly em funcees C. Consequentemente, nao podera ser usadacomo nome de variavel sem um erro de compilacao:“$ gcc -Wall ansi.c”“ansi.c: In function ‘main’:”“ansi.c:6: parse error before ‘asm’”“ansi.c:7: parse error before ‘asm’”

John Godoi, Mathias Santos GCC

Page 62: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Padroes da linguagem C

Em contraste, usando o parametro ‘-ansi’disabilita a palavra-chaveasm, e permite que o programa acima seja compiladocorretamente:“$ gcc -Wall -ansi ansi.c”“$ ./a.out”“the string asm is ‘6502’”Outras palavras-chaves nao padrees e macros definidaas pelasextensees do GNU C sao asm, inline, typeof, unix e vax.

John Godoi, Mathias Santos GCC

Page 63: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Padroes da linguagem C

O proximo exemplo mostra o efeito do parametro ‘-ansi’emsistemas usando a biblioteca GNU C, tais como sistemasGNU/Linux. O programa abaixo imprime o valor de pi, =3.14159..., da definicao do prepocessador M PI no arquivo decabecalhos ‘math.h’:# include <<math.h>>

# include <<stdio.h>>int main (void) {printf(“thevalueofpiis%f \n′′,M PI );return 0;}

John Godoi, Mathias Santos GCC

Page 64: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Padroes da linguagem C

A constante M PI nao e parte da biblioteca padrao ANSI/ ISO C.Nesse caso, o programa nao complicara com o parametro ‘-ansi’:“$ gcc -Wall -ansi pi.c”“pi.c: In function ‘main’:”“pi.c:7: ‘M PI’undeclared (first use in this function)”“pi.c:7: (Each undeclared identifier is reported only once )”“pi.c:7: for each function it appears in.′′

John Godoi, Mathias Santos GCC

Page 65: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Padroes da linguagem C

O programa pode ser compilado sem parametro ‘-ansi’. Nesse casoambas extensees de linguagem e biblioteca sao habilitadas porpadrao:“$ gcc -Wall pi.c”“$ ./a.out”“the value of pi is 3.141593”Tambem e possıvel compilar o programa usando o ANSI/ ISO C,habilitando somente as extensees da propria biblioteca GNU C.

John Godoi, Mathias Santos GCC

Page 66: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Padroes da linguagem C

Isso pode ser alcancado pela especificao de macros especiais, taiscomo GNU SOURCE, que habilita extensees da biblioteca GNU C:“$ gcc -Wall -ansi -D GNU SOURCE pi.c”“$ ./a.out”“the value of pi is 3.141593”

John Godoi, Mathias Santos GCC

Page 67: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Padroes da linguagem C

A biblioteca GNU C prove diversas dessas macros que permitecontrolar o suporte para extensees POSIX ( POSIX C SOURCE ),BSD ( BSD SOURCE ), SVID ( SVID SOURCE ), XOPEN( XOPEN SOURCE ) e GNU ( GNU SOURCE ).O parametro ‘-D’e usado para a definicao de macros.A macro GNU SOURCE habilita todas extensees, com asextensees POSIX tendo precedencia sobre as outras em casos emque hajam conflitos.

John Godoi, Mathias Santos GCC

Page 68: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

Referencias

Traduzido e adaptado de “An Introduction to GCC: for theGNU Compilers gcc and g++” - Brian Gough, Foreword byRichard M. Stallman, 2004, Network Theory Limited, GNUFree Documentation License, Version 1.2.

John Godoi, Mathias Santos GCC

Page 69: GCC - Compile! Linque! Debug!

GCC – C/C++Compilar!Vincular!

E mais!

Usando bibliotecas de arquivos cabecalhosParametros de compilacaoPadroes da linguagem CReferencias

2aparteYou will see in www.pinguim.pro.br

John Godoi, Mathias Santos GCC