Tabela de conteúdos
Compilando no Linux
GCC
Compilar é transformar um arquivo legível para o homem (chamado de código-fonte, source file em inglês) para um arquivo legível para a máquina (binário, binary). Quem faz esse trabalho é o compilador.
O compilador C/C++ padrão no Linux é o gcc
. Muitas distribuições vêm o gcc
incluído. O Compilador gcc
é um dos compiladores mais versáteis e avançados existentes. O gcc
suporta todos os padrões modernos do C atualmente usados, como o padrão ANSI C, assim como muitas extensões específicas do próprio gcc
. Utilizar o gcc
é simples. Vejamos alguns exemplos:
Compila o programa hello.c
e cria o binário hello
(opção –o
do gcc
)
$ gcc hello.c –o hello
Compila 2 programas (prog1.c
e prog2.c
) e cria o binário programa
.
$ gcc prog1.c prog2.c –oprograma
Compila o programa fat.c
, gera o binário fat
e indica para o compilador linkeditar a biblioteca matemática junto com binário (opção –l
do gcc).
$ gcc fat.c –o fat –lm
Compila o programa def.c
, gera o binário def
e cria a diretiva PLATAFORMA
(opção –D
do gcc
) com o valor Linux (veja o funcionamento em Pré-compilação).
$ gcc def.c –DPLATAFORMA=Linux –odef
Compila o programa inc.c
, gera o binário inc
. A opção –I
indica o caminho para os includes
(headers) do específicos do projeto e a opção –L
indica o caminho das bibliotecas específicas do projeto.
$ gcc inc.c –I../includes –L../libs –lmylib –o../bin/inc
Compila o progr1.c
e gera o binário progr1
. A opção –O
é para otimização do código gerado.
$ gcc –O –oprogr1 progr1.c
O libc
(glibc
) é uma biblioteca usada por quase todos os programas do Linux; o libjpeg
é usada em todos os programas que trabalham com o formato JPEG; e assim por diante. No sistema Linux essas bibliotecas são divididas em dois pacotes: um para ser usado por programas já compilados (glibc
e libjpeg
, por exemplo), e um para ser usado na compilação de programas que dependem dele (glibc-devel
e libjpeg-devel
, por exemplo). Portanto, para compilar programas mais complexos, será necessário ter esses dois pacotes instalados.
Makefiles
Se o programa é constituído por vários arquivos, e normalmente usam bibliotecas e header-files externos, será necessário compilar todos eles e juntá-los (link) corretamente. Para automatizar esse procedimento, usa-se o comando make
. Esse comando lê um arquivo chamado Makefile, onde estará o roteiro necessário para a compilação do programa. O objetivo básico do make
é permitir que seja construído um programa em pequenas etapas. Se muitos arquivos fontes compuserem o executável final, será possível alterar um arquivo e reconstruir o executável sem ter a necessidade de compilar os demais programas. Para tal, é necessário criar um arquivo chamado Makefile
.
O make
pode ser composto de várias linhas, cada um indicando como o executável deve ser construído. Normalmente, existe dependências entre as linhas, indicado a ordem de execução das linhas. A disposição das linhas (entradas) dentro do arquivo Makefile
não importa, pois o make
irá descobrir qual a ordem correta. O make
exige alguns cuidados para a criação do arquivo:
- Sempre colocar uma tabulação no começo de um comando, nunca espaços. Não deve ser utilizado uma tabulação antes de qualquer outra linha.
- O símbolo
#
(sustenido, tralha, cerquilha ou jogo da velha) indica uma comentário na linha. - Uma barra invertida no final de uma linha, indica que ela irá prosseguir na próxima linha. Ótimo para comandos longos.
Vejamos um exemplo:
install: all mv manipconfig /usr/local mv delbinario /usr/local all: manipconfig delbinario manipconfig: cria.o altera.o exclui.o consulta.o editor.o \ manipula.o principal.o gcc –L/home/laureano/libs –o cria.o altera.o exclui.o \ consulta.o editor.o manipula.o principal.o delbinario: del.c main.c gcc –o del.o main.o cria.o: cria.c gcc –c cria.c altera.o: altera.o gcc –c altera.c exclui.o: exclui.c gcc –c exclui.c consulta.o: cosulta.c gcc –c consulta.c editor.o: editor.c gcc –c editor.c manipula.o: manipula.c gcc –c manipula.c principal.o: principal.c gcc –c principal del.o: del.c gcc –c del.c main.o: main.c gcc –c main.c
Os comandos do arquivo Makefile
acima, seriam equivalentes a aos seguintes comandos (se todos fossem digitados):
$> gcc –c main.c $> gcc –c del.c $> gcc –c principal $> gcc –c manipula.c $> gcc –c editor.c $> gcc –c consulta.c $> gcc –c exclui.c $> gcc –c altera.c $> gcc –c cria.c $> gcc del.o main.o –o delbinario $> gcc –L/home/laureano/libs cria.o altera.o exclui.o consulta.o editor.o manipula.o principal.o –o manipconfig $> mv manipconfig /usr/local $> mv delbinario /usr/local
Para maiores informações sobre a utilização e opções dos comandos gcc
e make
, veja o manual on-line (help) do sistema Linux.