Makefiles

Pode ser inconveniente ter que digitar todas as linhas do gcc novamente, especialmente se você estiver realizando inúmeras alterações no código e possui várias bibliotecas. O utilitário make resolve este problema. Você pode usar o seguinte makefile para substituir a seqüência de compilação anterior:
  main: main.o util.o
         gcc -o main main.o util.o
  main.o: main.c util.h 
         gcc -c -g main.c 
 util.o: util.c util.h
         gcc -c -g util.c 

Digite isto em um arquivo chamado makefile e digite make para criar o executável. Observe que você deve preceder todas as linhas gcc com um espaço de parágrafo (8 espaços não bastarão, é necessário uma tabulação; as demais linhas devem estar alinhadas à esquerda).

Este makefile contém dois tipos de linhas. As linhas que aparecem alinhadas à esquerda são linhas de dependência. As linhas precedidas por uma tabulação são linhas executáveis, que podem conter qualquer comando UNIX válido. Uma linha de dependência indica que um arquivo é dependente de outro conjunto de arquivos. Por exemplo, main.o: main.c util.h diz que o arquivo main.o depende dos arquivos main.c e util.h. Se qualquer um destes dois arquivos for alterado, as linhas executáveis seguintes devem ser executada(s) para recriar main.o.

Observe que o executável final produzido pelo makefile inteiro é main, na linha 1 no makefile. O resultado final do makefile deve sempre ir na linha 1, onde este makefile diz que o arquivo main depende de main.o e util.o. Em caso de alterações, execute a linha gcc -o main main.o util.o para recriar main.

É possível colocar múltiplas linhas para serem executadas abaixo da linha de dependência (todas devem começar com uma tabulação). Um programa grande pode ter várias bibliotecas e um programa principal. O makefile recompila automaticamente tudo o que precisa ser recompilado por conta de uma alteração.

Se não estiver trabalhando em uma máquina UNIX, seu compilador provavelmente tem a funcionalidade equivalente à dos makefiles. Leia a documentação de seu compilador para aprender como utilizá-lo.

Agora você entende por que se tem incluído stdio.h nos programas anteriores. Ele é simplesmente uma biblioteca padrão que alguém criou há muito tempo e disponibilizou a outros programadores para facilitar suas vidas.