SlideShare uma empresa Scribd logo
1 de 69
Baixar para ler offline
GCC
Compile! Linque! Debug! E mais!
John Henrique Teixeira de Godoi
Mathias Felipe Lima Santos
Instituto de Ciˆ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
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.
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´arios arquivos
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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

Mais conteúdo relacionado

Mais procurados

Introdução+à+linguagem+c
Introdução+à+linguagem+cIntrodução+à+linguagem+c
Introdução+à+linguagem+cThiago Freitas
 
055 A 094 Material Auxiliar Para Curso AvançAdo I Msp430
055 A 094   Material Auxiliar Para Curso AvançAdo I Msp430055 A 094   Material Auxiliar Para Curso AvançAdo I Msp430
055 A 094 Material Auxiliar Para Curso AvançAdo I Msp430Texas Instruments
 
Linguagem C Entendendo a Programação
Linguagem C Entendendo a ProgramaçãoLinguagem C Entendendo a Programação
Linguagem C Entendendo a ProgramaçãoMonike Santos
 
Aula de C para Linux
Aula de C para LinuxAula de C para Linux
Aula de C para LinuxChris x-MS
 
Linguagen..
Linguagen..Linguagen..
Linguagen..essa
 
Aula 3 compiladores e interpretadores
Aula 3   compiladores e interpretadoresAula 3   compiladores e interpretadores
Aula 3 compiladores e interpretadoresLCCIMETRO
 
Aprenda a programar python
Aprenda a programar pythonAprenda a programar python
Aprenda a programar pythonLourenço Junior
 
Aprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoAprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoWeldir Fernando Dias
 
Apresentação php
Apresentação phpApresentação php
Apresentação phpwilliameier
 
Introdução à Computação Aula 09 - Algoritmos (Linguagens de Programação)
Introdução à Computação Aula 09 - Algoritmos (Linguagens de Programação)Introdução à Computação Aula 09 - Algoritmos (Linguagens de Programação)
Introdução à Computação Aula 09 - Algoritmos (Linguagens de Programação)Leinylson Fontinele
 
C sharp feup10set2001
C sharp feup10set2001C sharp feup10set2001
C sharp feup10set2001leojr_0
 
WebVibe Barueri 2011 - "PHP por quê ?"
WebVibe Barueri 2011 - "PHP por quê ?"WebVibe Barueri 2011 - "PHP por quê ?"
WebVibe Barueri 2011 - "PHP por quê ?"Hélio Costa e Silva
 
Apresentação Final a FINEP Projeto MonoBasic
Apresentação Final a FINEP Projeto MonoBasicApresentação Final a FINEP Projeto MonoBasic
Apresentação Final a FINEP Projeto MonoBasicAlessandro Binhara
 

Mais procurados (15)

Introdução+à+linguagem+c
Introdução+à+linguagem+cIntrodução+à+linguagem+c
Introdução+à+linguagem+c
 
Lp m2(parte1)
Lp m2(parte1)Lp m2(parte1)
Lp m2(parte1)
 
055 A 094 Material Auxiliar Para Curso AvançAdo I Msp430
055 A 094   Material Auxiliar Para Curso AvançAdo I Msp430055 A 094   Material Auxiliar Para Curso AvançAdo I Msp430
055 A 094 Material Auxiliar Para Curso AvançAdo I Msp430
 
Linguagem C Entendendo a Programação
Linguagem C Entendendo a ProgramaçãoLinguagem C Entendendo a Programação
Linguagem C Entendendo a Programação
 
Aula de C para Linux
Aula de C para LinuxAula de C para Linux
Aula de C para Linux
 
Linguagen..
Linguagen..Linguagen..
Linguagen..
 
Aula 3 compiladores e interpretadores
Aula 3   compiladores e interpretadoresAula 3   compiladores e interpretadores
Aula 3 compiladores e interpretadores
 
Aprenda a programar python
Aprenda a programar pythonAprenda a programar python
Aprenda a programar python
 
Aprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalhoAprenda a programar-luciano_ramalho
Aprenda a programar-luciano_ramalho
 
Apresentação php
Apresentação phpApresentação php
Apresentação php
 
Introdução à Computação Aula 09 - Algoritmos (Linguagens de Programação)
Introdução à Computação Aula 09 - Algoritmos (Linguagens de Programação)Introdução à Computação Aula 09 - Algoritmos (Linguagens de Programação)
Introdução à Computação Aula 09 - Algoritmos (Linguagens de Programação)
 
C sharp feup10set2001
C sharp feup10set2001C sharp feup10set2001
C sharp feup10set2001
 
WebVibe Barueri 2011 - "PHP por quê ?"
WebVibe Barueri 2011 - "PHP por quê ?"WebVibe Barueri 2011 - "PHP por quê ?"
WebVibe Barueri 2011 - "PHP por quê ?"
 
Apresentação Final a FINEP Projeto MonoBasic
Apresentação Final a FINEP Projeto MonoBasicApresentação Final a FINEP Projeto MonoBasic
Apresentação Final a FINEP Projeto MonoBasic
 
Software
SoftwareSoftware
Software
 

Semelhante a GCC - Compilar, Vincular e Mais com C/C

Semelhante a GCC - Compilar, Vincular e Mais com C/C (20)

Apostila chardwere
Apostila chardwereApostila chardwere
Apostila chardwere
 
Devc++
Devc++Devc++
Devc++
 
Apostila c
Apostila cApostila c
Apostila c
 
Linguagem c wellington telles - aula 02
Linguagem c   wellington telles - aula 02Linguagem c   wellington telles - aula 02
Linguagem c wellington telles - aula 02
 
C sharp lesson1
C sharp lesson1C sharp lesson1
C sharp lesson1
 
Algoritmia para o site do 10gi marcelo e ricardo
Algoritmia para o site do 10gi marcelo e ricardoAlgoritmia para o site do 10gi marcelo e ricardo
Algoritmia para o site do 10gi marcelo e ricardo
 
Paradigmas de Linguagem
Paradigmas de LinguagemParadigmas de Linguagem
Paradigmas de Linguagem
 
Introdução à Linguagem de Programação C
Introdução à Linguagem de Programação CIntrodução à Linguagem de Programação C
Introdução à Linguagem de Programação C
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
Apostila de dev
Apostila de devApostila de dev
Apostila de dev
 
Curso C e C++ - Teoria PDF.pdf
Curso C e C++ - Teoria PDF.pdfCurso C e C++ - Teoria PDF.pdf
Curso C e C++ - Teoria PDF.pdf
 
Seminário: C++
Seminário: C++Seminário: C++
Seminário: C++
 
Conceitos Fundamentais de Programacao
Conceitos Fundamentais de ProgramacaoConceitos Fundamentais de Programacao
Conceitos Fundamentais de Programacao
 
Apostila de dev
Apostila de devApostila de dev
Apostila de dev
 
apostila de dev.pdf
apostila de dev.pdfapostila de dev.pdf
apostila de dev.pdf
 
Apostila de Linguagem C
Apostila de Linguagem CApostila de Linguagem C
Apostila de Linguagem C
 
O compilador dev c++
O compilador dev c++O compilador dev c++
O compilador dev c++
 
Apostila de devc++ novo
Apostila de devc++ novoApostila de devc++ novo
Apostila de devc++ novo
 
Iniciando com django
Iniciando com djangoIniciando com django
Iniciando com django
 
Delphi6bd
Delphi6bdDelphi6bd
Delphi6bd
 

Mais de John Godoi

(5) maneiras de motivar a si mesmo
(5) maneiras de motivar a si mesmo(5) maneiras de motivar a si mesmo
(5) maneiras de motivar a si mesmoJohn Godoi
 
The Passionate Programmer (Career tips and learnings)
The Passionate Programmer (Career tips and learnings)The Passionate Programmer (Career tips and learnings)
The Passionate Programmer (Career tips and learnings)John Godoi
 
O jogo mental do poker
O jogo mental do pokerO jogo mental do poker
O jogo mental do pokerJohn Godoi
 
There is no box
There is no boxThere is no box
There is no boxJohn Godoi
 
Comandos do Linux
Comandos do LinuxComandos do Linux
Comandos do LinuxJohn Godoi
 
Intro to java 8
Intro to java 8Intro to java 8
Intro to java 8John Godoi
 
Introduction to apache spark
Introduction to apache sparkIntroduction to apache spark
Introduction to apache sparkJohn Godoi
 
Software craftsmanship
Software craftsmanshipSoftware craftsmanship
Software craftsmanshipJohn Godoi
 
Java e orientação a objetos - aula 01
Java e orientação a objetos - aula 01Java e orientação a objetos - aula 01
Java e orientação a objetos - aula 01John Godoi
 

Mais de John Godoi (15)

(5) maneiras de motivar a si mesmo
(5) maneiras de motivar a si mesmo(5) maneiras de motivar a si mesmo
(5) maneiras de motivar a si mesmo
 
The Passionate Programmer (Career tips and learnings)
The Passionate Programmer (Career tips and learnings)The Passionate Programmer (Career tips and learnings)
The Passionate Programmer (Career tips and learnings)
 
Spring boot
Spring bootSpring boot
Spring boot
 
O jogo mental do poker
O jogo mental do pokerO jogo mental do poker
O jogo mental do poker
 
There is no box
There is no boxThere is no box
There is no box
 
Gimplabs2
Gimplabs2 Gimplabs2
Gimplabs2
 
Gimplabs3
Gimplabs3 Gimplabs3
Gimplabs3
 
Git básico
Git básicoGit básico
Git básico
 
Gimplabs1
Gimplabs1 Gimplabs1
Gimplabs1
 
Shell Script
Shell ScriptShell Script
Shell Script
 
Comandos do Linux
Comandos do LinuxComandos do Linux
Comandos do Linux
 
Intro to java 8
Intro to java 8Intro to java 8
Intro to java 8
 
Introduction to apache spark
Introduction to apache sparkIntroduction to apache spark
Introduction to apache spark
 
Software craftsmanship
Software craftsmanshipSoftware craftsmanship
Software craftsmanship
 
Java e orientação a objetos - aula 01
Java e orientação a objetos - aula 01Java e orientação a objetos - aula 01
Java e orientação a objetos - aula 01
 

GCC - Compilar, Vincular e Mais com C/C

  • 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.
  • 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´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