====== 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 [[pre_compilacao|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.