Das Makefile baut die hello
ausführbar, wenn einer der folgenden Punkte zutrifft main.cpp
, hello.cpp
, factorial.cpp
geändert. Das kleinstmögliche Makefile zum Erreichen dieser Spezifikation hätte lauten können:
hello: main.cpp hello.cpp factorial.cpp
g++ -o hello main.cpp hello.cpp factorial.cpp
- Pro: sehr leicht zu lesen
- Nachteile: Wartungsalptraum, Verdoppelung der C++-Abhängigkeiten
- Nachteil: Effizienzproblem, wir kompilieren alle C++ neu, auch wenn nur eines geändert wurde
Um dies zu verbessern, kompilieren wir nur die C++-Dateien, die bearbeitet wurden. Dann verknüpfen wir einfach die resultierenden Objektdateien miteinander.
OBJECTS=main.o hello.o factorial.o
hello: $(OBJECTS)
g++ -o hello $(OBJECTS)
main.o: main.cpp
g++ -c main.cpp
hello.o: hello.cpp
g++ -c hello.cpp
factorial.o: factorial.cpp
g++ -c factorial.cpp
- Pro: Behebung des Effizienzproblems
- Nachteile: neuer Wartungsalptraum, möglicher Tippfehler bei den Regeln für Objektdateien
Um dies zu verbessern, können wir alle Objektdatei-Regeln durch eine einzige ersetzen .cpp.o
Regel:
OBJECTS=main.o hello.o factorial.o
hello: $(OBJECTS)
g++ -o hello $(OBJECTS)
.cpp.o:
g++ -c $< -o $@
- pro: zurück zu einem kurzen Makefile, das einigermaßen leicht zu lesen ist
Hier wird die .cpp.o
Regel definiert, wie man anyfile.o
de anyfile.cpp
.
$<
entspricht in diesem Fall der ersten Abhängigkeit, anyfile.cpp
$@
in diesem Fall mit dem Ziel übereinstimmt, anyfile.o
.
Die anderen Änderungen im Makefile sind:
- Erleichterung des Compilerwechsels von g++ zu einem beliebigen C++-Compiler.
- Erleichterung der Änderung der Compiler-Optionen.
- Erleichterung der Änderung der Linker-Optionen.
- Erleichterung der Änderung der C++-Quelldateien und der Ausgabe.
- Es wurde eine Standardregel "all" hinzugefügt, die als Schnellprüfung dient, um sicherzustellen, dass alle Quelldateien vorhanden sind, bevor versucht wird, die Anwendung zu erstellen.