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

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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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 → arquivosobjetos → 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