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

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.


GCC no Windows

O gcc tem uma versão para Windows que se chama MinGW. É a mesma instalada pelo ambiente Dev-C++ ou pelo CodeBlocks (mais recomendado!).

Se você precisar/quiser usar o gcc pela linha de comando, será necessário adicionar o diretório no qual ele foi instalado ao caminho de busca de executáveis. Isto é, o diretório bin dentro de onde foi instalado o Dev-C++ ou o MinGW. Geralmente, isso será ou C:\Dev-Cpp\bin ou C:\MinGW\bin. Se você não souber, procure pelo arquivo gcc.exe.

Para alterar a configuração de busca de executáveis (no Windows XP), o mais fácil é entrar no Painel de Controle, escolher a opção Sistema e seguir as instruções:

  1. Selecione a aba Avançado.
  2. Clique no botão Variáveis de ambiente.
  3. Em Variáveis do sistema, procure pela variável Path e clique duas vezes para editá-la.
    1. Se não conseguir editar (se seu usuário não tiver permissão para isso), procure pela variável homônima em Variáveis de usuário para (Seu nome) e edite-a.
    2. Se a variável de usuário Path não existir, crie-a clicando em Nova.
  4. Adicione o diretório do gcc ao final do valor da variável. Você deve separá-lo dos outros diretórios com ponto-e-vírgula (;). Claro, se você tiver criado a variável, não há do que separar.

A configuração será aplicada a todas as novas janelas do interpretador de comandos. (Se ele já estiver aberto, você terá que fechá-lo e abrir novamente.)

Para compilar um arquivo, o comando é igual ao do Linux. A única diferença é na hora de executá-lo: você não precisa digitar ./ antes do nome do programa; basta digitar

> prog

(Atenção: o caractere > não faz parte do comando que você deve digitar. Ele apenas representa o prompt que normalmente é mostrado pelo terminal.)