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