Verwendung von Makefile in C++
Dieser Artikel zeigt verschiedene Methoden zur Verwendung von Makefile in C++.
Verwenden Sie Makefile, um ein Programm mit mehreren Dateien einfach in C++ zu kompilieren
Makefile
ist der Name der Datei, die die Beziehung zwischen Programmquelldateien und zu kompilierenden Headern beschreibt. Diese Datei wird vom Dienstprogramm make
verwendet, das in der Befehlszeile aufgerufen wird, und fungiert als Mini-Build-System für das Code-Projekt. Beachten Sie jedoch, dass make
nicht auf die Programmiersprache und sogar auf die Programmkompilierung beschränkt ist, da es in Szenarien verwendet werden kann, in denen Dateien aufgrund von Änderungen an relativen Dateien aktualisiert werden müssen. Die Beziehungen werden durch die Regeln dargestellt, die die spezifischen Aktionen beschreiben. Das folgende Snippet zeigt die Struktur einer typischen Regel. Ein target
ist üblicherweise ein Name für die ausführbare Datei oder die Objektdateien. prerequisites
sind normalerweise Eingabedateien, die zur Ausgabe der Zieldatei benötigt werden. Ein recipe
ist eine Aktion, die von make
ausgeführt wird, und sie werden mit der Registerkarte in jeder neuen Zeile eingerückt. Beachten Sie, dass make
die Datei mit dem Namen makefile
oder Makefile
scannt, wenn sie im aktuellen Arbeitsverzeichnis vorhanden ist.
target: prerequisites
recipe
Die Regeln sind der Hauptteil des Makefile
, da sie der einzig notwendige Teil sind. Das folgende Beispiel zeigt die einfache Struktur Makefile
, mit der die ausführbare Datei mit dem Namen program
erstellt wird. Jetzt hat das Programm
die Voraussetzungen
- main.o
und library1.o
, die Objektdateien sind, die aus den folgenden Regeln ausgegeben werden. Beide haben ihre jeweiligen Rezepte, die bestimmte Voraussetzungen zusammenstellen, um die gegebene Ausgabe zu erhalten. Beachten Sie, dass der Befehl g++
der GNU C++-Compiler ist, der als Teil des Rezepts ausgeführt wird und mit den üblichen Befehlszeilenargumenten erstellt werden kann.
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
Ein weiteres Merkmal von Makefile
sind Variablen, die sich ähnlich wie die C++-Präprozessor-Makroausdrücke verhalten. Wir können nämlich Namensaliasnamen für Zeichenketten definieren, die in der Datei mehrmals vorkommen, und die Variablennamen platzieren. Beispielsweise zeigt das nächste Snippet die am Anfang der Datei definierte Variable OBJ
und enthält die Voraussetzungen für das Programm, die sich in der ersten Regel wiederholen. Beachten Sie jedoch, dass Variablen am effizientesten sind, wenn weitaus längere Zeichenketten ersetzt werden.
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
Darüber hinaus können wir andere Variablen definieren, die Compiler- oder Linker-Flags darstellen können, die normalerweise an mehreren Stellen im Makefile
verwendet werden. Wenn das Projekt groß ist und das Makefile
größer wird, ist es daher einfacher, die einzelne Zeile zu ändern, als jede Instanz des angegebenen Parameters zu ändern.
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
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