Usar Makefile em C++

Jinku Hu 13 maio 2021
Usar Makefile em C++

Este artigo irá demonstrar vários métodos de como usar o Makefile em C++.

Use Makefile para compilar um programa de vários arquivos facilmente em C++

Makefile é o nome do arquivo que descreve a relação entre os arquivos-fonte do programa e os cabeçalhos a serem compilados. Este arquivo é usado pelo utilitário make que é invocado na linha de comando e atua como um mini sistema de compilação para o projeto de código. Note, porém, que make não se limita à linguagem de programação e até mesmo à compilação do programa, pois pode ser utilizado em cenários onde os arquivos precisam ser atualizados com base nas modificações feitas nos arquivos relativos. As relações são representadas pelo conjunto de regras que descrevem as ações específicas. O trecho a seguir mostra a estrutura de uma regra típica. Um target é comumente um nome para os arquivos executáveis ​​ou de objeto. Os prerequisites geralmente são arquivos de entrada que são necessários para a saída do arquivo de destino. Uma recipe é uma ação conduzida pelo make, e eles são recuados com a guia em cada nova linha. Lembre-se de que make verifica o arquivo chamado makefile ou Makefile se ele existe no diretório de trabalho atual.

target: prerequisites
	recipe

As regras são a parte principal do Makefile, pois são a única parte necessária. O exemplo a seguir demonstra a estrutura simples Makefile que constrói o arquivo executável denominado program. Agora, o program tem os prerequisites - main.o e library1.o, que são arquivos-objeto produzidos a partir das regras abaixo. Ambos têm suas respectivas receitas que compilam certos pré-requisitos para obter a saída fornecida. Observe que, o comando g++ é o compilador GNU C++ que é executado como parte da receita e pode ser construído com os argumentos usuais de linha de comando.

program : main.o library1.o
    g++ -o program main.o library1.o
main.o : main.cpp header1.h
    g++ -c main.cpp
library1.o : library1.cpp library1.h
    g++ -c library1.cpp

Outra característica do Makefile são as variáveis ​​que se comportam de forma semelhante às expressões macro do pré-processador C++. Ou seja, podemos definir apelidos de nome para strings que aparecem no arquivo várias vezes e colocar os nomes das variáveis. Por exemplo, o próximo fragmento mostra a variável OBJ definida no início do arquivo e inclui pré-requisitos de programa que se repetem na primeira regra. Observe, porém, que as variáveis ​​são mais eficientes quando strings muito mais longas são substituídas.

OBJ = main.o library1.o

program : $(OBJ)
    g++ -o program $(OBJ)
main.o : main.cpp header1.h
    g++ -c main.cpp
library1.o : library1.cpp library1.h
    g++ -c library1.cpp

Além disso, podemos definir outras variáveis ​​que podem representar sinalizadores de compilador ou linker, geralmente usados ​​em vários locais no Makefile. Assim, quando o projeto é grande, e o Makefile fica maior, é mais fácil modificar uma única linha do que alterar todas as instâncias do parâmetro fornecido.

OBJ = main.o library1.o
CC = g++
LFLAGS = -lm

program : $(OBJ)
    $(CC) -o $(LFLAGS) program $(OBJ)
main.o : main.cpp header1.h
    $(CC) -c main.cpp
library1.o : library1.cpp library1.h
    $(CC) -c library1.cpp
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook