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