Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
GCC  Compile! Linque! Debug! E mais!       John Henrique Teixeira de Godoi         Mathias Felipe Lima Santos          Ins...
Avisos!      Esse material foi elaborado para o v´                                          ıdeo que deve ser entregue    ...
Indice  1   GCC – C/C++        GCC        Programando em C e C++
Indice  1   GCC – C/C++        GCC        Programando em C e C++  2   Compilar!        Compilando um programa em C        ...
Indice  1   GCC – C/C++        GCC        Programando em C e C++  2   Compilar!        Compilando um programa em C        ...
Indice  1   GCC – C/C++        GCC        Programando em C e C++  2   Compilar!        Compilando um programa em C        ...
GCC – C/C++                              Compilar!     GCC                               Vincular!    Programando em C e C...
GCC – C/C++                                Compilar!     GCC                                 Vincular!    Programando em C...
GCC – C/C++                               Compilar!     GCC                                Vincular!    Programando em C e...
GCC – C/C++                              Compilar!     GCC                               Vincular!    Programando em C e C...
GCC – C/C++                                             Compilando um programa em C                               Compilar...
GCC – C/C++                                             Compilando um programa em C                               Compilar...
GCC – C/C++                                             Compilando um programa em C                               Compilar...
GCC – C/C++                                             Compilando um programa em C                               Compilar...
GCC – C/C++                                             Compilando um programa em C                               Compilar...
GCC – C/C++                                             Compilando um programa em C                               Compilar...
GCC – C/C++                                             Compilando um programa em C                               Compilar...
GCC – C/C++                                              Compilando um programa em C                                Compil...
GCC – C/C++                                             Compilando um programa em C                               Compilar...
GCC – C/C++                                             Compilando um programa em C                               Compilar...
GCC – C/C++                                              Compilando um programa em C                                Compil...
GCC – C/C++                                             Compilando um programa em C                               Compilar...
GCC – C/C++                                              Compilando um programa em C                                Compil...
GCC – C/C++                                             Compilando um programa em C                               Compilar...
C´digo-fontes → arquivos objetos → execut´veis                                              o                             ...
C´digo-fontes → arquivos objetos → execut´veis                                               o                            ...
C´digo-fontes → arquivos objetos → execut´veis                                              o                             ...
C´digo-fontes → arquivos objetos → execut´veis                                               o                            ...
C´digo-fontes → arquivos objetos → execut´veis                                               o                            ...
C´digo-fontes → arquivos objetos → execut´veis                                              o                             ...
C´digo-fontes → arquivos objetos → execut´veis                                              o                             ...
C´digo-fontes → arquivos objetos → execut´veis                                              o                             ...
C´digo-fontes → arquivos objetos → execut´veis                                               o                            ...
C´digo-fontes → arquivos objetos → execut´veis                                               o                            ...
C´digo-fontes → arquivos objetos → execut´veis                                               o                            ...
C´digo-fontes → arquivos objetos → execut´veis                                               o                            ...
C´digo-fontes → arquivos objetos → execut´veis                                             o                              ...
C´digo-fontes → arquivos objetos → execut´veis                                              o                             ...
C´digo-fontes → arquivos objetos → execut´veis                                              o                             ...
C´digo-fontes → arquivos objetos → execut´veis                                               o                            ...
C´digo-fontes → arquivos objetos → execut´veis                                              o                             ...
C´digo-fontes → arquivos objetos → execut´veis                                              o                             ...
C´digo-fontes → arquivos objetos → execut´veis                                              o                             ...
C´digo-fontes → arquivos objetos → execut´veis                                              o                             ...
C´digo-fontes → arquivos objetos → execut´veis                                              o                             ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
GCC – C/C++       Usando bibliotecas de arquivos cabe¸alhos                                                               ...
Upcoming SlideShare
Loading in …5
×

GCC - Compile! Linque! Debug!

2,085 views

Published on

Published in: Technology
  • Be the first to comment

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

×