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