Usa Makefile in C++

Jinku Hu 15 maggio 2021
Usa Makefile in C++

Questo articolo illustrerà più metodi su come utilizzare Makefile in C++.

Usa Makefile per compilare facilmente un programma multi-file in C++

Makefile è il nome del file che descrive la relazione tra i file sorgente del programma e le intestazioni da compilare. Questo file è usato dall’utilità make che viene invocata sulla riga di comando e funge da mini sistema di compilazione per il progetto di codice. Si noti, tuttavia, che make non è limitato al linguaggio di programmazione e nemmeno alla compilazione del programma, poiché può essere utilizzato in scenari in cui i file devono essere aggiornati in base alle modifiche apportate nei file relativi. Le relazioni sono rappresentate dall’insieme di regole che descrivono le azioni specifiche. Il frammento di codice seguente mostra la struttura di una regola tipica. Un target è comunemente un nome per i file eseguibili o oggetto. I prerequisites sono generalmente file di input necessari per l’output del file di destinazione. Una recipe è un’azione condotta da make, e sono rientrati con il tab su ogni nuova riga. Ricorda che make scansiona il file chiamato Makefile o Makefile se esiste nella directory di lavoro corrente.

target: prerequisites
	recipe

Le regole sono la parte principale del Makefile in quanto sono l’unica parte necessaria. Il seguente esempio mostra la semplice struttura Makefile che costruisce il file eseguibile chiamato program. Ora, il program ha i prerequisites - main.o e library1.o, che sono file oggetto generati dalle regole seguenti. Entrambi hanno le rispettive ricette che compilano determinati prerequisiti per ottenere l’output fornito. Notare che il comando g++ è il compilatore GNU C++ che viene eseguito come parte della ricetta e può essere costruito con i soliti argomenti della riga di 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

Un’altra caratteristica di Makefile sono le variabili che si comportano in modo simile alle espressioni macro del preprocessore C++. Vale a dire, possiamo definire alias dei nomi per le stringhe che compaiono più volte nel file e inserire i nomi delle variabili. Ad esempio, il frammento successivo mostra la variabile OBJ definita all’inizio del file e include i prerequisiti program che si ripetono nella prima regola. Nota, tuttavia, le variabili sono le più efficienti quando vengono sostituite stringhe molto più lunghe.

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

Inoltre, possiamo definire altre variabili che possono rappresentare flag del compilatore o del linker, solitamente usati in più posizioni nel Makefile. Quindi, quando il progetto è grande e il Makefile diventa più grande, è più facile modificare la singola riga che cambiare ogni istanza del parametro dato.

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
Autore: 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