Linux: O makefile GNU

No Linux, um makefile é um arquivo de texto que descreve os arquivos que são necessários para construir um programa específico, bem como a forma de compilar e vincular os arquivos para construir o programa. Para um programa Linux composta de vários arquivos de origem e de cabeçalho, o makefile especifica o seguinte:

  • Os itens que faço cria - geralmente os arquivos objeto e o executável. Usando o termo alvo para se referir a qualquer item que faça tem que criar é comum.

  • Os arquivos ou outras acções necessárias para criar o alvo.

  • Que comanda a executar para criar cada alvo.

Suponha que você tenha um arquivo de origem C ++ chamado form.C que contém a seguinte diretiva de pré-processamento:

#include "Form.h" // Incluir arquivo de cabeçalho

O arquivo de objeto form.o claramente depende do arquivo de origem form.C eo arquivo de cabeçalho Form.h. Além dessas dependências, você deve especificar como faço converte o form.C arquivo para o arquivo de objeto form.o. Suponha que você queira faço invocar g ++ (porque o arquivo de origem está em C ++) com estas opções:

  • -c (Apenas compilar)

  • -g (Gerar informações de depuração)

  • -O2 (Otimizar alguns)

No makefile, você pode expressar essas opções com a seguinte regra:

# Este um comentário no makefile # As linhas seguintes indicam como form.o depende # no form.C e Form.h e como criar form.o.form.o: form.C form.hg ++ -c -g -O2 form.C

Neste exemplo, a primeira linha mostra noncomment form.o como o alvo e form.C e Form.h como os arquivos dependentes.

A linha a seguir a dependência indica como construir o alvo de seus dependentes. Esta linha deve começar com uma guia. Caso contrário, o faço comando sai com uma mensagem de erro, e você está coçando a cabeça, porque quando você olha para o makefile em um editor de texto, você não pode dizer a diferença entre uma guia e um espaço.

Agora que você sabe o segredo, a correção é para substituir o espaço no início da linha ofensiva com uma única guia.

A vantagem de usar make é que ele impede compilações desnecessárias. Afinal, você pode executar g ++ (ou gcc) A partir de um shell script para compilar e ligar todos os arquivos que compõem o aplicativo, mas o shell script compila tudo, mesmo que as compilações são desnecessárias.

GNU faço, Por outro lado, cria um alvo somente se um ou mais dos seus dependentes tenham alterado desde a última vez que o alvo foi construído. faço verifica esta mudança examinando a hora da última modificação do alvo e os dependentes.

faço trata o destino como o nome de uma meta a ser achieved- o alvo não tem que ser um arquivo. Você pode ter uma regra como esta:

clean: rm -f * .o

Esta regra especifica um alvo abstrato chamado limpar que não depende de nada. Esta declaração de dependência diz que para criar o alvo limpar, GNU faço chama o comando rm -f * .o, que exclui todos os arquivos que têm a .o extensão (ou seja, os arquivos de objeto). Assim, o efeito de criar o chamado alvo limpar é excluir os arquivos objeto.

menu