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