Compilando programas em C com o GCC
Compilando programas em C com o GCC
Atenção: este artigo assume que você está usando um sistema do tipo Unix (Linux, Mac OS). Se estiver no Windows, consulte a seção sobre o uso do gcc no Windows para saber o que você deve fazer de diferente.
Observação importante: o caractere $ que aparece no início das linhas de comando é apenas uma ilustração do prompt que costuma aparecer no terminal. Você não deve digitá-lo. (No Windows, usamos o caractere > com o mesmo significado.)
Observação importante: o caractere $ que aparece no início das linhas de comando é apenas uma ilustração do prompt que costuma aparecer no terminal. Você não deve digitá-lo. (No Windows, usamos o caractere > com o mesmo significado.)
Com o gcc já instalado no seu sistema, é muito simples usá-lo para compilar programas em C. Se o programa consistir de um único arquivo, você pode simplesmente executar este comando no terminal:
$ gcc prog.c -o prog
onde prog.c é o nome do arquivo que contém o código. Os outros dois parâmetros, -o prog, indicam o arquivo de saída do compilador — o arquivo executável que conterá o programa. Você não verá nenhuma mensagem na tela se a compilação ocorrer sem problemas; o compilador só diz alguma coisa quando ocorrem erros.
Você precisa especificar o nome do arquivo executável de saída pois o padrão, por razões históricas, é usar o arquivo a.out. Em geral, usamos o mesmo nome do arquivo de código, tirando a extensão .c. Veja que, ao contrário do Windows, o Linux não precisa da extensão .exe para reconhecer um arquivo executável; ele utiliza os atributos de permissão do arquivo para saber se ele é executável, dos quais o gcc já cuida automaticamente.
Para executar o programa, a maneira mais “universal” é digitar o seguinte comando no terminal:
$ ./prog
no qual os caracteres ./ indicam que o programa está no diretório (pasta) atual. É possível também configurar o shell para que não seja necessário fazer essa indicação, imitando o comportamento do Windows (os computadores da Pró-Aluno do IF estão configurados assim). Dessa maneira, você precisaria digitar apenas prog para executar o programa.
Para mudar de pasta no terminal, use o comando cd seguido da pasta para onde você quer ir. Por exemplo, se você salvou seu programa na pasta mac115 dentro da sua pasta pessoal, digite
$ cd mac115
Dica: ".." (dois pontos seguidos) significa "uma pasta acima". Portanto, se você estivesse na pasta mac115 e quisesse voltar para a pasta pessoal, poderia digitar "cd ..". Hierarquias de pastas são criadas com a barra normal "/" (e não com a barra invertida, como no Windows).
Algumas opções úteis
Ao fazer seus EPs, é muito importante verificar erros de sintaxe ou quaisquer outros problemas no código. Algumas opções podem ajudá-lo a fazer isso:
- -Wall
- ativa vários avisos que não são ativados normalmente. Pode dar alguns conselhos úteis.
- -pedantic
- ativa alguns avisos que existem de acordo com o padrão C mas que são desativados normalmente por extensões do gcc.
- -ansi
- compila seu programa estritamente de acordo com o padrão ANSI, desativando qualquer extensão específica do gcc. (Como os professores costumam adotar o gcc, isso não é sempre necessário. Mas preste atenção às instruções do seu professor quanto à compilação.)
O gcc pode otimizar o seu programa de modo a aumentar seu desempenho e/ou diminuir o tamanho do código de máquina gerado. Por omissão, o gcc não realiza nenhuma otimização. Há três níveis de otimização: 1, 2 e 3. Quanto maior o nível, maior deve ser a melhora no desempenho; mas também deve ser maior o tempo de compilação.
Para ativar a otimização, use as opções -O1, -O2 ou -O3 (a letra O, não o número zero), de acordo com o nível de otimização que você desejar. Também existe a opção -Os, que realiza as mesmas otimizações de -O2, excetuando as que costumam aumentar o tamanho do executável gerado.
Programas com mais de um arquivo-fonte
Não é muito mais complicado compilar programas cujo código está distribuído em vários arquivos; inclusive, na maioria dos casos, você pode usar o mesmo comando que usou para compilar programas de um arquivo só, simplesmente adicionando mais nomes de arquivo. Mas isso tem uma desvantagem: mesmo que tiver feito uma pequena alteração em um único arquivo, você terá que compilar todo o programa novamente. (Em alguns casos, quando essa alteração afeta outros arquivos, pode ser de fato necessário recompilar tudo.)
Por isso, você pode dividir a “compilação” em duas etapas: a compilação de verdade (sim, você foi enganado antes) e a montagem. A compilação é a etapa que transforma seu programa em código de máquina, e a montagem junta todos os pedaços necessários para fazer seu programa (incluindo algumas coisas que você não sabe que estão sendo incluídas mas que são necessárias para rodar um programa completo).
Para apenas compilar (e não montar) um arquivo, você deve usar o comando
$ gcc -c prog.c
Note que não foi necessário especificar o nome do arquivo a ser gerado. O gcc criará o arquivo prog.o (a extensão .o significa objeto ou programa-objeto), um nome que você, geralmente, não deveria mudar. (Você pode, no entanto, mudá-lo, também com a opção -o.)
Os vários programas-objeto devem ser montados para formar um executável. Isso é feito com o comando:
$ gcc -o monstrinho prog1.o prog2.o prog3.o ...
que gerará o executável monstrinho.
Assim, se você tiver um programa com três arquivos-fonte e resolver alterar o segundo, você pode recompilar apenas o segundo e apenas repetir a etapa de montagem (desde que já tenha os programas-objeto dos outros dois arquivos):
$ gcc -c prog2.c
$ gcc -o meuprog prog1.o prog2.o prog3.o
Makefiles
À medida que seus programas vão ficando mais complexos e com mais arquivos, fica mais trabalhoso cuidar da recompilação de arquivos individuais, principalmente quando há dependência entre os arquivos e várias opções adicionais de linha de comando.
Existe um utilitário muito usado, o GNU make, que facilita esse tipo de tarefa, permitindo que você gerencie os arquivos a serem compilados num arquivo chamado Makefile.
Comentários
Postar um comentário
Obrigado por sua contribuição em forma de comentário!