| |
— | gcc_linux [2023/09/12 16:14] (atual) – criada - edição externa 127.0.0.1 |
---|
| ====== 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'') |
| |
| <code> |
| $ gcc hello.c –o hello |
| </code> |
| |
| Compila 2 programas (''prog1.c'' e ''prog2.c'') e cria o binário ''programa''. |
| <code> |
| $ gcc prog1.c prog2.c –oprograma |
| </code> |
| |
| 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). |
| <code> |
| $ gcc fat.c –o fat –lm |
| </code> |
| |
| 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]]). |
| <code> |
| $ gcc def.c –DPLATAFORMA=Linux –odef |
| </code> |
| |
| 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. |
| <code> |
| $ gcc inc.c –I../includes –L../libs –lmylib –o../bin/inc |
| </code> |
| |
| Compila o ''progr1.c'' e gera o binário ''progr1''. A opção **''–O''** é para otimização do código gerado. |
| <code> |
| $ gcc –O –oprogr1 progr1.c |
| </code> |
| |
| 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: |
| |
| <code> |
| 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 |
| </code> |
| |
| Os comandos do arquivo ''Makefile'' acima, seriam equivalentes a aos seguintes comandos (se todos fossem digitados): |
| |
| <code> |
| $> 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 |
| </code> |
| |
| 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. |
| |