SlideShare uma empresa Scribd logo
1 de 69
Baixar para ler offline
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, 2011


Programa de Educa¸˜o em Software Livre - PESL
                 ca
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.
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
        Encontrando erros em um programa simples
        Compilando a partir de v´rios arquivos
                                a
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
                                                             ca


Criando 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
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
                                                              ca


Criando 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
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
                                                             ca


Criando 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
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
                                                              ca


Criando 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
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
                                                              ca


Ordem 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
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
                                                             ca


Ordem 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
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
                                                             ca


Ordem 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
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
                                                             ca


Recompilando 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
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
                                                              ca


Compilando 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
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
                                                              ca


Recompilando 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
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
                                                              ca


Vinculando 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
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
                                                              ca


Vinculando 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
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
                                                            ca


Vinculando 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
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
                                                             ca


Vinculando 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
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
                                                             ca


Vinculando 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
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
                                                              ca


Vinculando 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
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
                                                             ca


Vinculando 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
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
                                                             ca


Vinculando 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
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
                                                             ca


Ordem 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
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
                                                             ca


Ordem 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
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
                                                             ca


Ordem 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
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
                                                  e


Usando 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
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
                                                  e


Usando 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
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
                                                   e


Usando 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
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
                                                  e


Usando 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
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
                                                   e


Parˆ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
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
                                                  e


Parˆ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
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
                                                  e


Parˆ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
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
                                                   e


Parˆ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
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
                                                 e


Parˆ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
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
                                                   e


Parˆ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
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
                                                   e


Parˆ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
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
                                                  e


Parˆ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
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
                                                  e


Padr˜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
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
                                                   e


Padr˜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
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
                                                 e


Padr˜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
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
                                                 e


Padr˜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
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
                                                   e


Padr˜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
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
                                                  e


Padr˜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
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
                                                  e


Padr˜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
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
                                                  e


Padr˜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
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
                                                  e


Padr˜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
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
                                                 e


Padr˜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
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
                                                 e


Referˆ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
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
                                                e




2a parte
You will see in www.pinguim.pro.br




              John Godoi, Mathias Santos   GCC

Mais conteúdo relacionado

Mais procurados

IES GF - Linguagem de Programação Estruturada - Parte 1
IES GF - Linguagem de Programação Estruturada - Parte 1IES GF - Linguagem de Programação Estruturada - Parte 1
IES GF - Linguagem de Programação Estruturada - Parte 1Ramon Mayor Martins
 
Comparando python com outras linguagens de programação
Comparando python com outras linguagens de programaçãoComparando python com outras linguagens de programação
Comparando python com outras linguagens de programaçãoValore I/O
 
ESLPE 2008 - Desenvolvendo aplicações no Linux
ESLPE 2008 - Desenvolvendo aplicações no LinuxESLPE 2008 - Desenvolvendo aplicações no Linux
ESLPE 2008 - Desenvolvendo aplicações no LinuxJorge Pereira
 
Linguagen..
Linguagen..Linguagen..
Linguagen..essa
 
DotNet Framework e Orientação a Objetos 1 - Introdução
DotNet Framework e Orientação a Objetos 1 - IntroduçãoDotNet Framework e Orientação a Objetos 1 - Introdução
DotNet Framework e Orientação a Objetos 1 - IntroduçãoLorival Smolski Chapuis
 
C sharp feup10set2001
C sharp feup10set2001C sharp feup10set2001
C sharp feup10set2001leojr_0
 
Dart e Flutter do Server ao Client Side
Dart e Flutter do Server ao Client SideDart e Flutter do Server ao Client Side
Dart e Flutter do Server ao Client SideGDGFoz
 
Programação concorrente
Programação concorrenteProgramação concorrente
Programação concorrenteFabio Duarte
 
Introdução aos computadores e à World Wide Web
Introdução aos computadores e à World Wide WebIntrodução aos computadores e à World Wide Web
Introdução aos computadores e à World Wide WebCícero Quarto
 

Mais procurados (16)

IES GF - Linguagem de Programação Estruturada - Parte 1
IES GF - Linguagem de Programação Estruturada - Parte 1IES GF - Linguagem de Programação Estruturada - Parte 1
IES GF - Linguagem de Programação Estruturada - Parte 1
 
Comparando python com outras linguagens de programação
Comparando python com outras linguagens de programaçãoComparando python com outras linguagens de programação
Comparando python com outras linguagens de programação
 
ESLPE 2008 - Desenvolvendo aplicações no Linux
ESLPE 2008 - Desenvolvendo aplicações no LinuxESLPE 2008 - Desenvolvendo aplicações no Linux
ESLPE 2008 - Desenvolvendo aplicações no Linux
 
Linguagen..
Linguagen..Linguagen..
Linguagen..
 
Artigo Sobre Compiladores
Artigo Sobre CompiladoresArtigo Sobre Compiladores
Artigo Sobre Compiladores
 
Seminário: C#
Seminário: C#Seminário: C#
Seminário: C#
 
DotNet Framework e Orientação a Objetos 1 - Introdução
DotNet Framework e Orientação a Objetos 1 - IntroduçãoDotNet Framework e Orientação a Objetos 1 - Introdução
DotNet Framework e Orientação a Objetos 1 - Introdução
 
Compilador
CompiladorCompilador
Compilador
 
Linguagem de programação
Linguagem de programaçãoLinguagem de programação
Linguagem de programação
 
C sharp feup10set2001
C sharp feup10set2001C sharp feup10set2001
C sharp feup10set2001
 
Seminário: PHP
Seminário: PHPSeminário: PHP
Seminário: PHP
 
Dart e Flutter do Server ao Client Side
Dart e Flutter do Server ao Client SideDart e Flutter do Server ao Client Side
Dart e Flutter do Server ao Client Side
 
Pascal 70
Pascal 70Pascal 70
Pascal 70
 
Programação concorrente
Programação concorrenteProgramação concorrente
Programação concorrente
 
Programação C - Aula 1
Programação C - Aula 1Programação C - Aula 1
Programação C - Aula 1
 
Introdução aos computadores e à World Wide Web
Introdução aos computadores e à World Wide WebIntrodução aos computadores e à World Wide Web
Introdução aos computadores e à World Wide Web
 

Semelhante a GCC - Compile! Linque! Debug! (20)

Gcc
Gcc Gcc
Gcc
 
Apostila de devc++ novo
Apostila de devc++ novoApostila de devc++ novo
Apostila de devc++ novo
 
Paradigmas de Linguagem
Paradigmas de LinguagemParadigmas de Linguagem
Paradigmas de Linguagem
 
Seminário: C++
Seminário: C++Seminário: C++
Seminário: C++
 
Apostila de dev
Apostila de devApostila de dev
Apostila de dev
 
apostila de dev.pdf
apostila de dev.pdfapostila de dev.pdf
apostila de dev.pdf
 
Apostila c
Apostila cApostila c
Apostila c
 
Apostila chardwere
Apostila chardwereApostila chardwere
Apostila chardwere
 
15. introducao ao c++
15. introducao ao c++15. introducao ao c++
15. introducao ao c++
 
Apostila de dev
Apostila de devApostila de dev
Apostila de dev
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
Aula de C para Linux
Aula de C para LinuxAula de C para Linux
Aula de C para Linux
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
Apostila de C# & Asp.Net
Apostila de C# & Asp.NetApostila de C# & Asp.Net
Apostila de C# & Asp.Net
 
Mini Curso de C
Mini Curso de CMini Curso de C
Mini Curso de C
 
Linguagem C Entendendo a Programação
Linguagem C Entendendo a ProgramaçãoLinguagem C Entendendo a Programação
Linguagem C Entendendo a Programação
 
Jogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharpJogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharp
 
Jogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharpJogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharp
 
Csharp
CsharpCsharp
Csharp
 

Mais de PeslPinguim

Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao ArduinoPeslPinguim
 
Aula 4 redes Inclusão Digital
Aula 4 redes Inclusão DigitalAula 4 redes Inclusão Digital
Aula 4 redes Inclusão DigitalPeslPinguim
 
Aula 3 parte 2 software Inclusão Digital
Aula 3 parte 2 software Inclusão DigitalAula 3 parte 2 software Inclusão Digital
Aula 3 parte 2 software Inclusão DigitalPeslPinguim
 
Aula 3 software Inclusão Digital
Aula 3 software Inclusão DigitalAula 3 software Inclusão Digital
Aula 3 software Inclusão DigitalPeslPinguim
 
Aula 2 parte 2 hardware Inclusão Digital
Aula 2 parte 2 hardware Inclusão DigitalAula 2 parte 2 hardware Inclusão Digital
Aula 2 parte 2 hardware Inclusão DigitalPeslPinguim
 
Aula 2 hardware Inclusão Digital
Aula 2 hardware Inclusão DigitalAula 2 hardware Inclusão Digital
Aula 2 hardware Inclusão DigitalPeslPinguim
 
Aula 1 apresentacao
Aula 1 apresentacaoAula 1 apresentacao
Aula 1 apresentacaoPeslPinguim
 
Aula 5 internet Inclusão Digital
Aula 5 internet Inclusão DigitalAula 5 internet Inclusão Digital
Aula 5 internet Inclusão DigitalPeslPinguim
 
Apresentação1_
Apresentação1_Apresentação1_
Apresentação1_PeslPinguim
 
Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10PeslPinguim
 
Curso Básico de Java - Aula 5
Curso Básico de Java - Aula 5Curso Básico de Java - Aula 5
Curso Básico de Java - Aula 5PeslPinguim
 
Curso Básico de Java - Aula 4
Curso Básico de Java - Aula 4Curso Básico de Java - Aula 4
Curso Básico de Java - Aula 4PeslPinguim
 
Curso Básico de Java - Aula 1
Curso Básico de Java - Aula 1Curso Básico de Java - Aula 1
Curso Básico de Java - Aula 1PeslPinguim
 
Curso Básico de Java - Aula 7
Curso Básico de Java - Aula 7Curso Básico de Java - Aula 7
Curso Básico de Java - Aula 7PeslPinguim
 
Curso Básico de Java - Aula 3
Curso Básico de Java - Aula 3Curso Básico de Java - Aula 3
Curso Básico de Java - Aula 3PeslPinguim
 
Curso Básico de Java - Aula 2
Curso Básico de Java - Aula 2Curso Básico de Java - Aula 2
Curso Básico de Java - Aula 2PeslPinguim
 
Curso Básico de Java - Aula 9
Curso Básico de Java - Aula 9Curso Básico de Java - Aula 9
Curso Básico de Java - Aula 9PeslPinguim
 
Curso Básico de Java - Aula 8
Curso Básico de Java - Aula 8 Curso Básico de Java - Aula 8
Curso Básico de Java - Aula 8 PeslPinguim
 
Eletrônica aplicada - interruptor sonoro
Eletrônica aplicada - interruptor sonoroEletrônica aplicada - interruptor sonoro
Eletrônica aplicada - interruptor sonoroPeslPinguim
 

Mais de PeslPinguim (20)

Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao Arduino
 
Aula 4 redes Inclusão Digital
Aula 4 redes Inclusão DigitalAula 4 redes Inclusão Digital
Aula 4 redes Inclusão Digital
 
Aula 3 parte 2 software Inclusão Digital
Aula 3 parte 2 software Inclusão DigitalAula 3 parte 2 software Inclusão Digital
Aula 3 parte 2 software Inclusão Digital
 
Aula 3 software Inclusão Digital
Aula 3 software Inclusão DigitalAula 3 software Inclusão Digital
Aula 3 software Inclusão Digital
 
Aula 2 parte 2 hardware Inclusão Digital
Aula 2 parte 2 hardware Inclusão DigitalAula 2 parte 2 hardware Inclusão Digital
Aula 2 parte 2 hardware Inclusão Digital
 
Aula 2 hardware Inclusão Digital
Aula 2 hardware Inclusão DigitalAula 2 hardware Inclusão Digital
Aula 2 hardware Inclusão Digital
 
Apresentação1
Apresentação1Apresentação1
Apresentação1
 
Aula 1 apresentacao
Aula 1 apresentacaoAula 1 apresentacao
Aula 1 apresentacao
 
Aula 5 internet Inclusão Digital
Aula 5 internet Inclusão DigitalAula 5 internet Inclusão Digital
Aula 5 internet Inclusão Digital
 
Apresentação1_
Apresentação1_Apresentação1_
Apresentação1_
 
Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10
 
Curso Básico de Java - Aula 5
Curso Básico de Java - Aula 5Curso Básico de Java - Aula 5
Curso Básico de Java - Aula 5
 
Curso Básico de Java - Aula 4
Curso Básico de Java - Aula 4Curso Básico de Java - Aula 4
Curso Básico de Java - Aula 4
 
Curso Básico de Java - Aula 1
Curso Básico de Java - Aula 1Curso Básico de Java - Aula 1
Curso Básico de Java - Aula 1
 
Curso Básico de Java - Aula 7
Curso Básico de Java - Aula 7Curso Básico de Java - Aula 7
Curso Básico de Java - Aula 7
 
Curso Básico de Java - Aula 3
Curso Básico de Java - Aula 3Curso Básico de Java - Aula 3
Curso Básico de Java - Aula 3
 
Curso Básico de Java - Aula 2
Curso Básico de Java - Aula 2Curso Básico de Java - Aula 2
Curso Básico de Java - Aula 2
 
Curso Básico de Java - Aula 9
Curso Básico de Java - Aula 9Curso Básico de Java - Aula 9
Curso Básico de Java - Aula 9
 
Curso Básico de Java - Aula 8
Curso Básico de Java - Aula 8 Curso Básico de Java - Aula 8
Curso Básico de Java - Aula 8
 
Eletrônica aplicada - interruptor sonoro
Eletrônica aplicada - interruptor sonoroEletrônica aplicada - interruptor sonoro
Eletrônica aplicada - interruptor sonoro
 

GCC - Compile! Linque! Debug!

  • 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, 2011 Programa de Educa¸˜o em Software Livre - PESL ca
  • 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. Indice 1 GCC – C/C++ GCC Programando em C e C++
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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 ca Criando 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. 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 ca Criando 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. 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 ca Criando 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. 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 ca Criando 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. 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 ca Ordem 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. 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 ca Ordem 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. 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 ca Ordem 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. 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 ca Recompilando 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. 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 ca Compilando 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. 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 ca Recompilando 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. 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 ca Vinculando 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. 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 ca Vinculando 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. 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 ca Vinculando 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. 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 ca Vinculando 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. 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 ca Vinculando 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. 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 ca Vinculando 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. 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 ca Vinculando 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. 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 ca Vinculando 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. 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 ca Ordem 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. 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 ca Ordem 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. 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 ca Ordem 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. 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 e Usando 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. 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 e Usando 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. 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 e Usando 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. 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 e Usando 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. 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 e Parˆ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. 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 e Parˆ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. 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 e Parˆ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. 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 e Parˆ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. 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 e Parˆ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. 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 e Parˆ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. 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 e Parˆ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. 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 e Parˆ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. 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 e Padr˜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. 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 e Padr˜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. 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 e Padr˜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. 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 e Padr˜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. 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 e Padr˜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. 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 e Padr˜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. 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 e Padr˜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. 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 e Padr˜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. 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 e Padr˜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. 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 e Padr˜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. 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 e Referˆ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. 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 e 2a parte You will see in www.pinguim.pro.br John Godoi, Mathias Santos GCC