Utilisez Makefile en C++

Jinku Hu 16 mai 2021
Utilisez Makefile en C++

Cet article présente plusieurs méthodes d’utilisation de Makefile en C++.

Utilisez Makefile pour compiler facilement un programme multi-fichier en C++

Makefile est le nom du fichier qui décrit la relation entre les fichiers source du programme et les en-têtes à compiler. Ce fichier est utilisé par l’utilitaire make qui est appelé sur la ligne de commande, et il agit comme un mini système de construction pour le projet de code. Notez cependant que make n’est pas limité au langage de programmation et même à la compilation du programme, car il peut être utilisé dans des scénarios où les fichiers doivent être mis à jour en fonction des modifications apportées aux fichiers relatifs. Les relations sont représentées par l’ensemble de règles qui décrivent les actions spécifiques. L’extrait de code suivant montre la structure d’une règle typique. Un target est généralement un nom pour les fichiers exécutables ou objets. Les prerequisites sont généralement des fichiers d’entrée qui sont nécessaires pour sortir le fichier cible. Une recipe est une action menée par le make, et ils sont indentés avec l’onglet sur chaque nouvelle ligne. Notez que make scanne le fichier nommé makefile ou Makefile s’il existe dans le répertoire de travail actuel.

target: prerequisites
	recipe

Les règles sont la partie principale du Makefile car elles sont la seule partie nécessaire. L’exemple suivant montre la structure simple Makefile qui construit le fichier exécutable nommé program. Maintenant, le program a les prerequisites - main.o et library1.o, qui sont des fichiers objets sortis des règles ci-dessous. Les deux ont leurs recettes respectives qui compilent certains prérequis pour obtenir la sortie donnée. Notez que la commande g++ est le compilateur GNU C++ qui s’exécute dans le cadre de la recette et peut être construit avec les arguments de ligne de commande habituels.

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

Une autre caractéristique de Makefile est des variables qui se comportent de la même manière que les expressions de macro du préprocesseur C++. À savoir, nous pouvons définir des alias de nom pour les chaînes qui apparaissent plusieurs fois dans le fichier et placer les noms de variables. Par exemple, l’extrait suivant montre la variable OBJ définie au début du fichier, et il inclut les prérequis program qui se répètent dans la première règle. Notez cependant que les variables sont les plus efficaces lorsque des chaînes beaucoup plus longues sont remplacées.

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

De plus, nous pouvons définir d’autres variables qui peuvent représenter des drapeaux de compilateur ou d’éditeur de liens, généralement utilisés à plusieurs endroits dans le Makefile. Ainsi, lorsque le projet est gros, et que le Makefile grossit, il est plus facile de modifier la ligne unique que de changer chaque instance du paramètre donné.

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