Verwendung von Makefile in C++

Jinku Hu 13 Mai 2021
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
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