Mein Projektverzeichnis sieht folgendermaßen aus:
/project
Makefile
main
/src
main.cpp
foo.cpp
foo.h
bar.cpp
bar.h
/obj
main.o
foo.o
bar.o
Ich möchte, dass mein Makefile alle .cpp
Dateien im /src
Ordner mit .o
Dateien im /obj
Ordner kompiliert und dann alle .o
Dateien /obj
in der Ausgabe-Binärdatei im Ordner der obersten Ebene verknüpft /project
.
Ich habe so gut wie keine Erfahrung mit Makefiles und bin mir nicht sicher, wonach ich suchen soll, um dies zu erreichen.
Ist dies auch ein "guter" Weg, dies zu tun, oder gibt es einen Standardansatz für das, was ich versuche?
c++
build-process
makefile
Austin Hyde
quelle
quelle
Antworten:
Makefile Teil der Frage
Dies ist ziemlich einfach, es sei denn, Sie müssen nicht verallgemeinern, versuchen Sie etwas wie den folgenden Code (ersetzen Sie jedoch die Leerzeicheneinrückung durch Tabulatoren in der Nähe von g ++).
Automatische Erzeugung von Abhängigkeitsgraphen
Ein "Muss" für die meisten Make-Systeme. Mit GCC in kann in einem einzigen Durchgang als Nebeneffekt der Kompilierung ausgeführt werden, indem
-MMD
demCXXFLAGS
und-include $(OBJ_FILES:.o=.d)
dem Ende des Makefile-Körpers ein Flag hinzugefügt wird:Und wie bereits erwähnt, haben Sie immer GNU Make Manual dabei , es ist sehr hilfreich.
quelle
OBJ_FILES = $(patsubst src/%.cpp,obj/%.o,$(CPP_FILES))
.$<
sollte$^
für die Regel von main.exe gelten und ich denke, es gibt einen Tippfehler mitobj/%.o: src/%cpp
.make: *** No rule to make target '/main.o', needed by 'bin/main'. Pare.
Wildcard funktioniert auch für mich, aber ich möchte eine Randnotiz für diejenigen geben, die Verzeichnisvariablen verwenden. Verwenden Sie immer einen Schrägstrich für den Ordnerbaum (keinen Backslash), da dies sonst fehlschlägt:
quelle