GCC - Compile! Linque! Debug!

1,887 views
1,803 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,887
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
28
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

GCC - Compile! Linque! Debug!

  1. 1. GCC Compile! Linque! Debug! E mais! John Henrique Teixeira de Godoi Mathias Felipe Lima Santos Instituto de Ciˆncias e Tecnologia e Universidade Federal de S˜o Paulo a S˜o Jos´ dos Campos – SP, Brasil a e Novembro, 2011Programa de Educa¸˜o em Software Livre - PESL ca
  2. 2. Avisos! Esse material foi elaborado para o v´ ıdeo que deve ser entregue na disciplina de multim´ıdia. Algumas tradu¸˜es podem n˜o ser fi´is mas se adequavam co a e melhor ao contexto. Al´m do cont´udo desses slides tem a parte pr´tica que ser´ e e a a exibida durante a apresenta¸˜o. ca Algumas bibliotecas e configura¸˜es podem ser necess´rias ce a para a execu¸˜o de alguns exemplos, como GNU Database ca Management Library (GDBM). A biblioteca GDBM armazena pares de valores-chaves em um arquivo DBM, um tipo de arquivos de dados que permite armazenar e indexar por uma chave.
  3. 3. Indice 1 GCC – C/C++ GCC Programando em C e C++
  4. 4. Indice 1 GCC – C/C++ GCC Programando em C e C++ 2 Compilar! Compilando um programa em C Encontrando erros em um programa simples Compilando a partir de v´rios arquivos a
  5. 5. Indice 1 GCC – C/C++ GCC Programando em C e C++ 2 Compilar! Compilando um programa em C Encontrando erros em um programa simples Compilando a partir de v´rios arquivos a 3 Vincular! C´digo-fontes → arquivos objetos → execut´veis o a Ordem para vincular os arquivos objetos Recompilando e revinculando Vinculando com bibliotecas externas Ordem de vincula¸˜o das bibliotecas ca
  6. 6. Indice 1 GCC – C/C++ GCC Programando em C e C++ 2 Compilar! Compilando um programa em C Encontrando erros em um programa simples Compilando a partir de v´rios arquivos a 3 Vincular! C´digo-fontes → arquivos objetos → execut´veis o a Ordem para vincular os arquivos objetos Recompilando e revinculando Vinculando com bibliotecas externas Ordem de vincula¸˜o das bibliotecas ca 4 E mais! Usando bibliotecas de arquivos cabe¸alhos c Parˆmetros de compila¸˜o a ca Padr˜es da linguagem C o Referˆncias e
  7. 7. GCC – C/C++ Compilar! GCC Vincular! Programando em C e C++ E mais!Uma breve hist´ria do GCC o Criador do GNU C Compiler (GCC) ´ Richard Stallman,que e fundou o projeto GNU, em 1984, para criar um sistema operacional, baseado em Unix, como software livre. Precisava de um compilador C, e devido a falta de compiladores livres naquela ´poca, criou-se um do zero. e 1o lan¸amento do GCC em 1987, sendo o primeiro compilador c otimizador ANSI C port´til lan¸ado como software livre. a c 1992, foi adicionado a capacidade de compilar C++ 2001, adicionado melhorias na otimiza¸˜o e no suporte ao ca C++ 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
  8. 8. GCC – C/C++ Compilar! GCC Vincular! Programando em C e C++ E mais!Principais funcionalidades do GCC GCC ´ um compilador port´vel que roda na maioria das e a plataformas dispon´ıveis atualmente, e criar sa´ ıdas para diferentes tipos de processadores (PC, microcontrollers, DSPs e CPUs 64-bits). GCC permite compilar um programa para diferentes plataformas, produzindo arquivos execut´veis para diferentes a sistemas a partir de qualquer outro com GCC. GCC ´ escrito em C e com um forte foco na portabilidade, e pode se auto-compilar, para que seja adaptado a novos sistemas facilmente. John Godoi, Mathias Santos GCC
  9. 9. GCC – C/C++ Compilar! GCC Vincular! Programando em C e C++ E mais!Principais funcionalidades do GCC GCC tem uma arquitetura modular, permitindo suporte para novas linguagens e arquiteturas a serem adicionadas. Adicionando uma nova linguagem ao GCC permite o uso dessa linguagem em qualquer arquitetura. Finalmente, e mais importante, GCC ´ um e software livre, distribu´ sob a GNU General Public License (GNU ıdo GPL). O que significa que vocˆ tem a liberdade para us´-lo, alter´-lo, e a a assim como outros software GNU. John Godoi, Mathias Santos GCC
  10. 10. GCC – C/C++ Compilar! GCC Vincular! Programando em C e C++ E mais!Programando em C e C++ C e C++ s˜o linguagens que permitem acesso direto a a mem´ria do computado. o Usadas para escrever sistemas de baixo n´ ıvel, e aplica¸˜es co onde alta-perfomance e controle dos recurso usados s˜oa cr´ ıticos. Exigem um cuidado com o acesso correto mem´ria, para o evitar corromper outras estruturas de dados. Existem t´cnicas, usando GCC por exemplo, que ajudam a e detectar prov´veis erros durante a compila¸˜o, mas que n˜o a ca a eliminam o “risco ” de usar tais linguagens. John Godoi, Mathias Santos GCC
  11. 11. GCC – C/C++ Compilando um programa em C Compilar! Encontrando erros em um programa simples Vincular! Compilando a partir de v´rios arquivos a E mais!Compilando um programa em C Podemos compilar programas a partir de um unico arquivo, ou de ´ v´rios outros, e tamb´m podemos usar bibliotecas do sistema e a e arquivos de cabe¸alho. Compila¸˜o trata-se do processo de c ca converte um programa de um c´digo fonte em texto, em uma o linguagem tal como C ou C++, em um c´digo de m´quina, uma o a sequˆncia de 1’s e 0’s usados para controla a Unidade Central de e processamento (CPU) do computador. Esse c´digo ´ armazendo o e em um arquivo tamb´m conhecido como arquivo execut´vel, ou e a bin´rio. a John Godoi, Mathias Santos GCC
  12. 12. GCC – C/C++ Compilando um programa em C Compilar! Encontrando erros em um programa simples Vincular! Compilando a partir de v´rios arquivos a E mais!Compilando um programa simples em C Usaremos o exemplo cl´ssico, Hello World, como exemplo de a programa 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
  13. 13. GCC – C/C++ Compilando um programa em C Compilar! Encontrando erros em um programa simples Vincular! Compilando a partir de v´rios arquivos a E mais!Compilando um programa simples em C Para compilar ‘hello.c’: “$ gcc -Wall hello.c -o hello” O arquivo de sa´ ´ definido usando o parˆmetro ‘-o’. Se omitido, a sa´ ´ ıda e a ıda e escrita em um arquivo chamado ‘a.out’. O parˆmetro ‘-Wall’ativa a os avisos para os erros mais comuns ainda na compila¸˜o - ca recomenda-se sempre use esse parˆmetro! Para executar o a programa, digite o caminho do execut´vel assim: “$ ./hello” O a que carregar´ o arquivo execut´vel na mem´ria e far´ a CPU a a o a executar as instru¸˜es contidas nele. co John Godoi, Mathias Santos GCC
  14. 14. GCC – C/C++ Compilando um programa em C Compilar! Encontrando erros em um programa simples Vincular! Compilando a partir de v´rios arquivos a E mais!Encontrando erros em um programa simples Exemplo, ‘printf’com formato de ponto flutuante, ‘%f’, usado para imprimir um valor inteiro: # include <<stdio.h>> int main (void) { printf (“Twoplustwois%f n , 4); return 0; } Um erro que pode passar despercebido primeira vista, mas detectado se o parˆmetro ‘-Wall’estiver acionado. a John Godoi, Mathias Santos GCC
  15. 15. GCC – C/C++ Compilando um programa em C Compilar! Encontrando erros em um programa simples Vincular! Compilando a partir de v´rios arquivos a E mais!Encontrando erros em um programa simples Ao compilar o c´digo acima, o gcc lan¸a um aviso com a seguinte o c mensagem: “$ gcc -Wall bad.c -o bad” “bad.c: In function ‘main’:” “bad.c:6: warning: double format, different type arg (arg 2)” O que indica o uso incorreto de formato no ‘printf’, na linha 6. As mensagens produzidas pelo GCC sempre seguem o modelo - arquivo:n´mero da linha:mensagem. u John Godoi, Mathias Santos GCC
  16. 16. GCC – C/C++ Compilando um programa em C Compilar! Encontrando erros em um programa simples Vincular! Compilando a partir de v´rios arquivos a E mais!Encontrando erros em um programa simples O compilador ´ capaz de distinguir entre as mensagens de erro, o e que previne compilar um c´digo com problemas, e de aviso que o indicam poss´ıveis problemas, n˜o causariam problemas na a compila¸˜o. Nesse caso, o formato correto seria ‘%d’. ca Sem o parˆmetro ‘-Wall’o programa aparentemente compilar a normalmente, mas produz uma sa´ incorreta: ıda “$ gcc bad.c -o bad” “$ ./bad” “Two plus two is 2.585495 (saida incorreta)” John Godoi, Mathias Santos GCC
  17. 17. GCC – C/C++ Compilando um programa em C Compilar! Encontrando erros em um programa simples Vincular! Compilando a partir de v´rios arquivos a E mais!Encontrando erros em um programa simples N´meros inteiros e pontos flutuantes s˜o armazenados de forma u a diferentes na mem´ria, e costumam ocupar quantidades de bytes o diferentes, causando sa´ ıdas incorretas. Al´m de gerar sa´ e ıdas incorretas, fun¸˜es que n˜o s˜o usadas corretamente podem causar co a a a falha do programa, e para prevenir poss´ıveis problemas ´ e aconselh´vel verificar os avisos do compilador. Obs.: O parˆmetro a a ‘-Wall’´ capaz de identificar os erros que comumente ocorrem em e C. John Godoi, Mathias Santos GCC
  18. 18. GCC – C/C++ Compilando um programa em C Compilar! Encontrando erros em um programa simples Vincular! Compilando a partir de v´rios arquivos a E mais!Compilando a partir de v´rios arquivos a Programa divididos em v´rios arquivos: a c´digo mais f´cil de editar e entender (codigosgrandes) o a compilar separadamente cada arquivos Exemplo, ‘Hello World’dividido nos arquivos ‘main.c’, ‘hello fn.c’e o cabe¸alho ‘hello.h’. c //main.c # include “hello.h ” int main (void) { hello (“world“); return 0; } John Godoi, Mathias Santos GCC
  19. 19. GCC – C/C++ Compilando um programa em C Compilar! Encontrando erros em um programa simples Vincular! Compilando a partir de v´rios arquivos a E mais!Compilando a partir de v´rios arquivos a A chamada da fun¸˜o printf ´ feita atrav´s de uma fun¸˜o externa, ca e e ca hello( ), definida em ‘hello fn.c’. O programa ‘main’tamb´m inclui e o cabe¸alho ‘hello.h’que cont´m a declara¸˜o da fun¸˜o hello( ). c e ca ca A declara¸˜o ´ usada para garantir que os tipos da fun¸˜o ca e ca chamada combinam com a fun¸˜o definida. ca Como a fun¸˜o main n˜o chama a fun¸˜o ‘printf’diretamente, n˜o ca a ca a h´ necessidade incluir a biblioteca ‘stdio.h’no ‘main.c’. a //hello.h void hello (const char ∗ name); John Godoi, Mathias Santos GCC
  20. 20. GCC – C/C++ Compilando um programa em C Compilar! Encontrando erros em um programa simples Vincular! Compilando a partir de v´rios arquivos a E mais!Compilando a partir de v´rios arquivos a //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 instru¸˜o # include, ca no caso de # include “FILE.h ”, para indexar a biblioteca ´ feita e um procura pelo arquivo no diret´rio atual, ent˜o busca-se nos o a diret´rios do sistema. o E para # include <<FILE.h>>a busca pelo arquivo ´ feita apenas e nos diret´rios do sistema. o John Godoi, Mathias Santos GCC
  21. 21. GCC – C/C++ Compilando um programa em C Compilar! Encontrando erros em um programa simples Vincular! Compilando a partir de v´rios arquivos a E mais!Compilando a partir de v´rios arquivos a Para compilar: “$ gcc -Wall main.c hello fn.c -o newhello” Obs.: O arquivo cabe¸alho, ‘hello.h’, n˜o foi inclu´ na lista de c a ıdo arquivos. A diretiva # include “hello.h ” no c´digo-fonte instrue o o compilador para inclu´ automaticamente aonde ´ necess´rio. ı-lo e a Para executar: “$ ./newhello” “Hello, world!” John Godoi, Mathias Santos GCC
  22. 22. GCC – C/C++ Compilando um programa em C Compilar! Encontrando erros em um programa simples Vincular! Compilando a partir de v´rios arquivos a E mais!Compilando os arquivos separadamente Ao realizar uma mudan¸a qualquer em uma fun¸˜o separada: Num c ca unico arquivo: ´ o programa inteiro deve ser recompilado, pode ser um processo lento C´digos em arquivos diferentes: o somente os arquivos que possuem mudan¸as precisam ser c recompilados. Os arquivos-fonte s˜o compilados separadamente e a ent˜o vinculados - um processo de duas fases. a John Godoi, Mathias Santos GCC
  23. 23. GCC – C/C++ Compilando um programa em C Compilar! Encontrando erros em um programa simples Vincular! Compilando a partir de v´rios arquivos a E mais!Compilando os arquivos separadamente 1 Na 1a etapa: um arquivo ´ compilado sem criar um e execut´vel.O resultado ´ referenciado como um a e arquivo objeto que tem a extens˜o ‘.o’quando a usando GCC. 2 Na 2a etapa: O Lincador combina todos os arquivos objetos para criar um unico execut´vel. ´ a John Godoi, Mathias Santos GCC
  24. 24. GCC – C/C++ Compilando um programa em C Compilar! Encontrando erros em um programa simples Vincular! Compilando a partir de v´rios arquivos a E mais!Compilando os arquivos separadamente Em um arquivo objeto temos o c´digo de m´quina sem referˆncias o a e para endere¸os de mem´ria das fun¸˜es (ou variaveis) em outros c o co arquivos, que ficam indefinidos Isso permite que os c´digos fontes sejam compilados sem uma o referˆncia direta entre esses. O lincados preenche os endere¸os e c restantes quando produz o execut´vel. a John Godoi, Mathias Santos GCC
  25. 25. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caCriando arquivos objetos de c´digo-fontes o O parˆmetro ‘-c’´ usado para compilar um c´digo-fonte para um a e o arquivo objeto. Por exemplo, o seguinte comando ir´ compilar o a c´digo-fonte ‘main.c’para um arquivo objeto: o “$ gcc -Wall -c main.c” Isso produz um arquivo objeto ‘main.o’cont´m o c´digo de e o m´quina para a fun¸˜o main. Cont´m a refˆncia para fun¸˜o a ca e e ca externa hello, mas o endere¸o de mem´ria ´ deixado indefinido no c o e arquivo objeto nesse est´gio (queserapreenchidopelolincador ). a John Godoi, Mathias Santos GCC
  26. 26. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caCriando arquivos objetos de c´digo-fontes o O comando que corresponde a compilar o c´digo fonte da fun¸˜o o ca hello em ‘hello fn.c’´: e “$ gcc -Wall -c hello fn.c” Isso produz um arquivo objeto ‘hello fn.o’. Perceba que n˜o existe necessidade de usar o parˆmetro ‘-o’para a a especificar o nome do arquivo de sa´ nesse caso. Quando ıda compilando com ‘-c’o compilador automaticamente cria um arquivo objeto que o nome ´ o mesmo do c´digo-fonte, com e o ‘.o’diferente da extens˜o original. a N˜o h´ necessidade de inserir o arquivo cabe¸alho ‘hello.h’na linha a a c de comando, pois j´ ´ incluido automaticamenteo pelos comandos ae # include no ‘main.c’e ‘hello fn.c’. John Godoi, Mathias Santos GCC
  27. 27. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caCriando execut´veis a partir de arquivos objetos a O passo final em criar um arquivo execut´vel ´ usar o gcc para a e vincular os arquivos objetos e preencher os endere¸os das fun¸˜es c co externas que faltam. Para vincular os arquivos objetos, eles s˜o a simplesmente listados na linha de comando: “$ gcc main.o hello fn.o -o hello” Esse ´ um dos poucos casos onde n˜o existe a necessidade do uso e a do parˆmetro de aviso ‘-Wall’, j´ que os c´digos-fontes foram a a o separadamente compilados com sucesso para arquivos objetos. Uma vez que os c´digos fontes foram compilados, vincular ´ um o e processo desambigo pode falhar ou n˜o, e s´ falhar´ se existirem a o a referˆncias que n˜o poderem ser resolvidas. e a John Godoi, Mathias Santos GCC
  28. 28. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caCriando execut´veis a partir de arquivos objetos a Para realizar o passo de vincula¸˜o o gcc usar o vinculador ld, que ca ´ um programa separado. Em sistemas GNU ´ usado o GNU ld. e e Outros sistemas podem usado o GNU linker com o GCC, ou podem usar seus pr´prios vinculadores. o Ao rodar o vinculador, o gcc cria um arquivo execut´vel a partir a dos arquivos objetos. O arquivos execut´vel pode ser rodado por: a “$ ./hello” “Hello, world!” Produzindo a mesma sa´ da vers˜o que utiliza um unico arquivo. ıda a ´ John Godoi, Mathias Santos GCC
  29. 29. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caOrdem para vincular os arquivos objetos Em sistemas derivados do Unix, o comportamento tradicional de vinculadores e compilados ´ procurar por fun¸˜es externas da e co esquerda para a direita nos arquivos objetos especificados na linha de comando. Isso significa que o arquivo obejto que cont´m a e defini¸˜o de uma fun¸˜o deveria aparecer depois de alguns aruivos ca ca que chamaram aquela fun¸˜o. ca Nesse caso, o arquivo ‘hello fn.o’cont´m hello que deveria ser e especificado depois de ‘main.o’, j´ que main chama hello: a “$ gcc main.o hello fn.o -o hello” (ordem correta) John Godoi, Mathias Santos GCC
  30. 30. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caOrdem para vincular os arquivos objetos Com alguns compiladores ou vinculadores a ordem inversa produziria 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 n˜o h´ nenhum arquivo obejto contendo hello depois de a a ‘main.o’. John Godoi, Mathias Santos GCC
  31. 31. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caOrdem para vincular os arquivos objetos Mas atualmente compiladores e vinculadores ir˜o buscar em todos a arquivos objetos, mesmo fora de ordem, mas como nem todos compildadores fazem isso ´ melhor seguir a ordem convencional e dos arquivos objetos da esquerda para a direita. Assim vale a pena manter isso na mente caso vocˆ encontre e problemas imprevistos com referˆncias indefinidas, e todos os e arquivos objetos est˜o presentes na linha de comando. a John Godoi, Mathias Santos GCC
  32. 32. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caRecompilando e revinculando Para mostrar como os c´digos-fontes podem ser compilados o independentemente n´s iremos editar o programa main ‘main.c’e o modific´-lo para mostrar uma sauda¸˜o para todos ao inv´s do a ca e mundo: # include “hello.h ” int main (void) { hello (“everyone“); // mudado de “world” return 0; } John Godoi, Mathias Santos GCC
  33. 33. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caCompilando os arquivos separadamente O arquivo atualizado ‘main.c’pode agora ser recompilado com o seguinte comando: “$ gcc -Wall -c main.c” Isso produzir´ um novo arquivo objeto ‘main.o’. N˜o h´ a a a necessidade de criar um novo arquivo objeto para ‘hello fn.c’, j´ a que seu arquivo e dependentes, tais como arquivos cabe¸alhos, n˜o c a sofreram altera¸˜es. co John Godoi, Mathias Santos GCC
  34. 34. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caRecompilando e revinculando O novo arquivo objeto pode ser revinculado com a fun¸˜o hello ca para criar um novo execut´vel: a “$ gcc main.o hello fn.o -o hello” O execut´vel resultante ‘hello’agora usa a nova fun¸˜o main para a ca produzir a seguinte sa´ ıda: “$ ./hello” “Hello, everyone!” Note que somente o arquivo ‘main.c’foi recompilado e ent˜oa revinculado com os arquivos objetos existentes para a fun¸˜o hello. ca John Godoi, Mathias Santos GCC
  35. 35. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caVinculando com bibliotecas externas Uma biblioteca ´ uma cole¸˜o de arquivos objetos precompilados e ca que podem ser vinculados em programas. O uso mais comum de bibliotecas ´ para prover fun¸˜es do e co sistemas, tal como a fun¸˜o de raiz quadrada sqrt encontrada na ca na biblioteca do C “math”. Bibliotecas s˜o tipicamente arqmazenadas em arquivos especiais a com a extens˜o ‘.a’, referenciadas como bibliotecas est´ticas. Elas a a s˜o criadas arquivos objetos com ferramentas separadas do gcc, a como o GNU archiver ar, e usado pelo vinculador para resolver referˆncias a fun¸˜es no tempo de compila¸˜o. e co ca John Godoi, Mathias Santos GCC
  36. 36. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caVinculando com bibliotecas externas As bibliotecas padr˜es do sistema s˜o normalmente encontradas o a nos diret´rios ‘/usr/lib’e ‘/lib’. Por exemplo, a biblioteca math ´ o e normalmente armazenada no arquivo ‘/usr/lib/libm.a’em sistemas baseados no Unix. O prot´tipo das correspondentes declara¸˜es para as fun¸˜es nessa o co co biblioteca pode ser encontrado no arquivo de cabe¸alhoc ‘/usr/include/math.h’. A biblioteca padr˜o do pr´prio C ´ a o e arqmazenada em ‘/usr/lib/libc.a’e cont´m fun¸˜es especificadas e co no padr˜o ANSI/ISO C, tais como ‘printf’– essa biblioteca ´ a e vinculada por padr˜o para todos os programas em C. a John Godoi, Mathias Santos GCC
  37. 37. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caVinculando com bibliotecas externas Exemplo de programa que chama uma fun¸˜o externa sqrt na ca biblioteca 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
  38. 38. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caVinculando com bibliotecas externas Ao tentar criar um execut´vel de c´digo fonte sozinho o compilado a o d´ como sa´ um erro no est´gio de vincula¸˜o: a ıda a ca “$ 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
  39. 39. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caVinculando com bibliotecas externas O problema ´ que a referˆncia para a fun¸˜o sqrt n˜o pode ser e e ca a resolvida sem a biblioteca externa math ‘libm.a’. A fun¸˜o sqrt ca n˜o ´ definida no programa ou na biblioteca padr˜o ‘libc.a’, e o a e a compilador n˜o vincula o arquivo ‘libm.a’ao menos que seja a explicitamente selecionado. A prop´sito, o arquivo mencionado na o mensagem de erro ‘/tmp/ccbR60jm.o’´ um arquivo objeto e tempor´rio criado pelo compilador a partir do ‘calc.c’, a fim de a tentar realizar o processo de vincula¸˜o. ca John Godoi, Mathias Santos GCC
  40. 40. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caVinculando com bibliotecas externas Para habilitar o compilador vincular a fun¸˜o sqrt ao programa ca main em ‘calc.c’n´s precisamos fornecer a biblioteca ‘libm.a’. Uma o forma ´bvia de realizar isso ´ especificar explicitamente na linha de o e comando: “$ gcc -Wall calc.c /usr/lib/libm.a -o calc” A biblioteca ‘libm.a’cont´m os arquivos objetos para todas a e fun¸˜es matem´ticas, tais como sin, cos, exp, log e sqrt. O co a vinculador procura por esse para achar o arquivo objeto contendo a fun¸˜o sqrt. ca John Godoi, Mathias Santos GCC
  41. 41. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caVinculando com bibliotecas externas Uma vez que o arquivo objeto para a fun¸˜o sqrt ´ encontrado, o ca e programa main pode ser vinculado e produzir o execut´vel a completo: “$ ./calc” “The square root of 2.0 is 1.414214” O arquivo execut´vel inclue o c´digo de m´quina para a fun¸˜o a o a ca main e o c´digo de m´quina para a fun¸˜o sqrt, copiado do o a ca correspondente arquivo objeto na biblioteca ‘libm.a’. John Godoi, Mathias Santos GCC
  42. 42. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caVinculando com bibliotecas externas Para evitar ter que especificar longos caminhos na linha de comando, o compilador disponibilizar uma op¸˜o de atalho ‘-l’para ca vincular bibliotecas. Por exemplo o seguinte comando, “$ gcc -Wall calc.c -lm -o calc” ´ equivalente ao original comando anterior usando o nome e completo da biblioteca ‘/usr/lib/libm.a’. Em geral, o parˆmetro ‘-lNAME ‘anexar´ arquivos objetos com o a a arquivo da biblioteca ‘libNAME.a’nos diret´rios padr˜es. o e Adicionalmente diret´rios podem ser especificados com parˆmetros o a na linha de comando ou vari´veis de ambiente. a John Godoi, Mathias Santos GCC
  43. 43. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caOrdem de vincula¸˜o das bibliotecas ca A ordem das bibliotecas na linha de comando segue a mesma conve¸˜o dos arquivos objetos: eles s˜o buscado da esquerda para ca a a direita – uma biblioteca contendo a defini¸˜o de uma fun¸˜o ca ca deveria aparecer depois de qualquer arquivo fonte ou arquivos objetos que a usem. Isso inclue biblioteca especificadas com o parˆmetro de atalho‘-l’, como vemos no comando a seguir: a “$ gcc -Wall calc.c -lm -o calc (correto)” John Godoi, Mathias Santos GCC
  44. 44. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caOrdem de vincula¸˜o das bibliotecas ca Ao tentar compilar, colocando ‘-lm’antes do arquivo que a usa, resultar´ no erro: a “$ cc -Wall -lm calc.c -o calc (incorreto)” “main.o: In function ‘main’:” “main.o(.text + 0xf ): undefined reference to ‘sqrt’because there is no library or object file containing sqrt after ‘calc.c’.” John Godoi, Mathias Santos GCC
  45. 45. C´digo-fontes → arquivos objetos → execut´veis o a GCC – C/C++ Ordem para vincular os arquivos objetos Compilar! Recompilando e revinculando Vincular! Vinculando com bibliotecas externas E mais! Ordem de vincula¸˜o das bibliotecas caOrdem de vincula¸˜o das bibliotecas ca Quando diversas bibliotecas s˜o usadas, a mesma conve¸˜o deveria a ca ser seguida pelas pr´prias. Uma biblioteca que chama uma fun¸˜o o ca externa definada em outra biblioteca apareceria antes da biblioteca contendo a fun¸˜o. ca Por exemplo, um programa ‘data.c’usando a biblioteca GNU Linear Programming ‘libglpk.a’, que por sua vez usa a biblioteca math ‘libm.a’, deveria ser compilado como, “$ gcc -Wall data.c -lglpk -lm” j´ que os arquivos objetos em ‘libglpk.a’usam fun¸˜es definada em a ce ‘libm.a’. John Godoi, Mathias Santos GCC
  46. 46. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias eUsando bibliotecas de arquivos cabe¸alhos c Ao usar uma biblioteca ´ essencial incluir arquivo cabe¸alhos e c apropriados, em ordem ao declarar os argumentos de fun¸˜es e os ce valores de retorno com os tipos corretos. Sem declara¸˜es, os ce argumentos de uma fun¸˜o podem ser passado com tipo errado, ca causando resultados adulterados. O pr´ximo exemplo mostrar outro programa que faz uma fun¸˜o o ca chamar a biblioteca math do C. John Godoi, Mathias Santos GCC
  47. 47. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias eUsando bibliotecas de arquivos cabe¸alhos c Nesse caso, a fun¸˜o pow ´ usada para calcular o cubo de 2. ca e # 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
  48. 48. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias eUsando bibliotecas de arquivos cabe¸alhos c Entretanto, o programa cont´m um erro – o comando # include e para ‘math.h’est´ faltando, ent˜o o prot´tipo double pow a a o (doublex, doubley ) dado n˜o ser´ encontrado pelo compilador. a a Compilando o programa sem qualquer parˆmetros para avisos a produzir´ um arquivo execut´vel que gerar´ resultados incorretos: a a a “$ gcc badpow.c -lm” “$ ./a.out (resultado incorreto, deveria ser 8)” “Two cubed is 2.851120” Os resultados s˜o adulterados porque os argumentos e o valor de a retorno da chamada pow s˜o passados com tipos incorretos. a John Godoi, Mathias Santos GCC
  49. 49. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias eUsando bibliotecas de arquivos cabe¸alhos c O que poderia ser detectado acionando o parˆmetro ‘-Wall’: a “$ 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 parˆmetro de aviso ‘-Wall’detecta diversos a problemas que poderiam ser ignorados. John Godoi, Mathias Santos GCC
  50. 50. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias eParˆmetros de compila¸˜o a ca Essas parˆmetros controlam funcionalidades tais como busca de a caminhos usados para localiza¸˜o de bibliotecas e arquivos ca inclu´ ıdos, o uso adicional de avisos e diagn´sticos, prepocessador o de macros e dialetos do C. Um problema comum quando compilando um programa que usa arquivos cabe¸alhos para bibliotecas ´ o erro: c e FILE.h : No such file or directory (arquivo nao encontrado) Isso ocorre se um arquivo de cabe¸alho n˜o est´ presente nos c a a diret´rios de arquivos padr˜es usados pelo gcc. o e John Godoi, Mathias Santos GCC
  51. 51. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias eParˆmetros de compila¸˜o a ca Um problema similar pode ocorre para bibliotecas: /usr/bin/ld: cannot find library (biblioteca nao encontrada) Isso acontece se a biblioteca usada para vincula¸˜o n˜o est´ ca a a presente nos diret´rios padr˜es usados pelo gcc. o e Por padr˜o, o gcc busca por arquivos de cabe¸alhos nos seguintes a c diret´rios: o /usr/local/include/ /usr/include/ e os nos seguintes diret´rios para bibliotecas: o /usr/local/lib/ /usr/lib/ John Godoi, Mathias Santos GCC
  52. 52. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias eParˆmetros de compila¸˜o a ca A lista de de diret´rios para cabe¸alhos ´ frequentemente o c e referenciada para caminho para inclus˜o, e a lista de diret´rios a o para bibliotecas como diret´rio de busca ou caminho de v´ o ınculo. Os diret´tios nesses caminhos s˜o buscados em ordem, do primeiro o a ao ultimo nas duas listas acima. Por exemplo, um arquivo de ´ cabe¸alho encontrado em ‘/usr/local/include’tem precedˆncia em c e rela¸˜o ao um arquivo com mesmo nome em ‘/usr/include’. ca Similarmente, uma biblioteca encontrada em ‘/usr/local/lib’ tem precedˆncia em rela¸˜o a outra com mesmo nome em ‘/usr/lib’. e ca John Godoi, Mathias Santos GCC
  53. 53. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias eParˆmetros de compila¸˜o a ca Os caminhos padr˜es de busca podem tamb´m incluir adicionais e e dependendo do sistema ou local espec´ ıfico dos diret´rios, e os o diret´rios na instala¸˜o do GCC mesmo. o ca Por exemplo, em plataformas 64-bit ‘lib64’diret´rios adicionais o podem ser buscado por padr˜o.a Quando bibliotecas adicinais s˜o instaladas em outros diret´rios ´ a o e necess´rio extender os caminhos de busca, de forma que as a bibliotecas sejam achadas. Os parˆmetros do compilador ‘-I’e ‘-L’adicionam novos diret´rios a o ao in´ do caminho de inclus˜o e busca de bibliotecas ıcio a respectivamente. John Godoi, Mathias Santos GCC
  54. 54. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias eParˆmetros de compila¸˜o a ca O programa ‘dbmain.c’, que cria um arquivo DBM contendo uma chave ‘testkey’com o valor ‘testvalue’: # include <<stdio.h>> # include <<gdbm.h>> int main (void) { GDBM FILE dbf; datum key = “testkey ”, 7 ; //key, length datum value = “testvalue ”, 9 ; //value, length printf (“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
  55. 55. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias eParˆmetros de compila¸˜o a ca O programa usa um arquivo de cabe¸alho ‘gdbm.h’e uma biblioteca c ‘libgdbm.a’. Se a biblioteca foi instalada na localiza¸˜o padr˜o de ca a ‘/usr/local/lib’, com o arquivo cabe¸alho em ‘/usr/local/include’, c ent˜o o programa pode ser compilado com o seguinte comando: a “$ gcc -Wall dbmain.c -lgdbm” Ambos diret´rios s˜o parte dos caminhos de v´ o a ınculos e inclus˜o a padr˜es. e Entretanto, se GDBM foi instalado em uma localiza¸˜o diferente, ca tentar compilar o programa ir´ dar o seguinte erro: a “$ gcc -Wall dbmain.c -lgdbm” “dbmain.c:1: gdbm.h: No such file or directory” John Godoi, Mathias Santos GCC
  56. 56. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias eParˆmetros de compila¸˜o a ca Por exemplo, se a vers˜o 1.8.3 do pacote GDBM est´ instalado no a a diret´rio ‘/opt/gdbm-1.8.3’a localiza¸˜o do cabe¸alho poderia ser, o ca c /opt/gdbm-1.8.3/include/gdbm.h que n˜o ´ parte dos caminhos a e de inclus˜o padr˜es. Adicionando os diret´rio aproprioado ao a e o caminho de inclus˜o com o comando ‘-I’permite que o programa a seja compilado, mas n˜o vinculado: a “$ 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 diret´rio contendo a biblioteca ainda est´ faltando no caminho o a de v´ınculo. Ele pode ser adicionado usando o seguinte parˆmetros: a “-L/opt/gdbm-1.8.3/lib/” John Godoi, Mathias Santos GCC
  57. 57. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias eParˆmetros de compila¸˜o a ca A seguinte linha de comando permite que o programa seja compilado e vinculado: “$ gcc -Wall -I/opt/gdbm-1.8.3/include -L/opt/gdbm-1.8.3/lib dbmain.c -lgdbm” Isso produz o execut´vel final vinculado a biblioteca GCBM. a John Godoi, Mathias Santos GCC
  58. 58. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias ePadr˜es da linguagem C o Por padr˜o, o gcc compila programas usando o dialeto GNU da a linguagem C, referenciado como GNU C. Esse dialeto incorpora o padr˜o oficial ANSI/ ISO para a linguagem C com diversas a extens˜es ut´is do GNU, tais como fun¸˜es aninhadas e vetores de e e ce tamanho dinˆmico. A maioria dos programas ANSI/ ISO a compilar˜o sob o GNU C sem problemas. a Existem diversos parˆmetros que controlam o dialeto do C usado a pelo gcc. Os mais comumente usados s˜o ‘-ansi’e ‘-pedantic’. a John Godoi, Mathias Santos GCC
  59. 59. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias ePadr˜es da linguagem C o O especif´ dialeto para a linguagem C para cada padr˜o pode ıcio a tamb´m ser selecionado com o parˆmetro ‘-std’. e a Ocasionalmente um programa ANSI/ ISO v´lido pode ser a incompat´ com as extens˜es GNU C. Para lidar com essa ıvel e situa¸˜o, o parˆmetros do compilador ‘-ansi’desabilita aquelas ca a extens˜es GNU que tiverem conflito com o padr˜o ANSI/ ISO. Em e a sistemas usando a biblioteca GNU C (glibc) pode-se tamb´m e desabilitar a biblioteca padr˜o do C. Isso permite que os programas a sejam escritos em ANSI/ ISO C sejam compilados sem efeitos indesej´veis das extens˜es do GNU. a e John Godoi, Mathias Santos GCC
  60. 60. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias ePadr˜es da linguagem C o Por exemplo, o programa ANSI/ ISO C que usa uma vari´vel a chamada asm: # include <<stdio.h>> int main (void) { const char asm[]= “6502 ”; printf (“thestringasmis‘%s n , asm); return 0; } John Godoi, Mathias Santos GCC
  61. 61. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias ePadr˜es da linguagem C o A vari´vels asm ´ v´lida sob o padr˜o ANSI/ ISO, mas esse a e a a programa n˜o ser´ compilado no GNU C porque asm ´ um palavra a a e chave para a extens˜o GNU C, o que permite usar instru¸˜es a ce assembly em fun¸˜es C. Consequentemente, n˜o poder´ ser usada ce a a como nome de vari´vel sem um erro de compila¸˜o: a ca “$ 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
  62. 62. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias ePadr˜es da linguagem C o Em contraste, usando o parˆmetro ‘-ansi’disabilita a palavra-chave a asm, e permite que o programa acima seja compilado corretamente: “$ gcc -Wall -ansi ansi.c” “$ ./a.out” “the string asm is ‘6502’” Outras palavras-chaves n˜o padr˜es e macros definidaas pelas a e extens˜es do GNU C s˜o asm, inline, typeof, unix e vax. e a John Godoi, Mathias Santos GCC
  63. 63. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias ePadr˜es da linguagem C o O pr´ximo exemplo mostra o efeito do parˆmetro ‘-ansi’em o a sistemas usando a biblioteca GNU C, tais como sistemas GNU/Linux. O programa abaixo imprime o valor de pi, = 3.14159..., da defini¸˜o do prepocessador M PI no arquivo de ca cabe¸alhos ‘math.h’: c # include <<math.h>> # include <<stdio.h>> int main (void) { printf(“thevalueofpiis%f n , M PI ); return 0; } John Godoi, Mathias Santos GCC
  64. 64. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias ePadr˜es da linguagem C o A constante M PI n˜o ´ parte da biblioteca padr˜o ANSI/ ISO C. a e a Nesse caso, o programa n˜o complicar´ com o parˆmetro ‘-ansi’: a a a “$ 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
  65. 65. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias ePadr˜es da linguagem C o O programa pode ser compilado sem parˆmetro ‘-ansi’. Nesse caso a ambas extens˜es de linguagem e biblioteca s˜o habilitadas por e a padr˜o: a “$ gcc -Wall pi.c” “$ ./a.out” “the value of pi is 3.141593” Tamb´m ´ poss´ compilar o programa usando o ANSI/ ISO C, e e ıvel habilitando somente as extens˜es da pr´pria biblioteca GNU C. e o John Godoi, Mathias Santos GCC
  66. 66. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias ePadr˜es da linguagem C o Isso pode ser alcan¸ado pela especifi¸˜o de macros especiais, tais c ca como GNU SOURCE, que habilita extens˜es da biblioteca GNU C: e “$ gcc -Wall -ansi -D GNU SOURCE pi.c” “$ ./a.out” “the value of pi is 3.141593” John Godoi, Mathias Santos GCC
  67. 67. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias ePadr˜es da linguagem C o A biblioteca GNU C provˆ diversas dessas macros que permite e controlar o suporte para extens˜es POSIX ( POSIX C SOURCE ), e BSD ( BSD SOURCE ), SVID ( SVID SOURCE ), XOPEN ( XOPEN SOURCE ) e GNU ( GNU SOURCE ). O parˆmetro ‘-D’´ usado para a defini¸˜o de macros. a e ca A macro GNU SOURCE habilita todas extens˜es, com as e extens˜es POSIX tendo precedˆncia sobre as outras em casos em e e que hajam conflitos. John Godoi, Mathias Santos GCC
  68. 68. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias eReferˆncias e Traduzido e adaptado de “An Introduction to GCC: for the GNU Compilers gcc and g++” - Brian Gough, Foreword by Richard M. Stallman, 2004, Network Theory Limited, GNU Free Documentation License, Version 1.2. John Godoi, Mathias Santos GCC
  69. 69. GCC – C/C++ Usando bibliotecas de arquivos cabe¸alhos c Compilar! Parˆmetros de compila¸˜o a ca Vincular! Padr˜es da linguagem C o E mais! Referˆncias e2a parteYou will see in www.pinguim.pro.br John Godoi, Mathias Santos GCC

×