Ich versuche, eine generische make-Datei zu erstellen, sodass ich mein Projekt unabhängig davon kompilieren kann, wie viele Dateien ich hinzufüge und wo ich mich entscheide, sie in die Projektnavigation einzufügen."make" schlägt fehl, wenn Mustererkennung verwendet wird
In meiner schrittweisen Annäherung kam ich zu diesem Makefile, das gut funktioniert.
CC=g++
OBJECTS=main.o board.o
VPATH=src:\
src/board:\
include/board:\
build:\
bin
boardG : main.o board.o
$(CC) -o bin/boardG build/main.o build/board.o
main.o : main.cpp board.hpp
$(CC) -c -I include $< -o build/[email protected]
board.o : board.cpp board.hpp
$(CC) -c -I include $< -o build/[email protected]
Diese Version wird die Arbeit gut machen. Siehe Ausgabe unten:
[email protected]:~/code/projects/boardG$ make
g++ -c -I include src/main.cpp -o build/main.o
g++ -c -I include src/board/board.cpp -o build/board.o
g++ -o bin/boardG build/main.o build/board.o
Das Problem hier ist, dass ich eine Regel für jede CPP-Datei erstellen muss. Genau das versuche ich zu vermeiden. Daher habe ich versucht, wie dies die Version oben mit passenden Muster anzupassen:
CC=g++
OBJECTS=main.o board.o
VPATH=src:\
src/board:\
include/board:\
build:\
bin
boardG : main.o board.o
$(CC) -o bin/boardG build/main.o build/board.o
%.o : %.cpp %.hpp
$(CC) -c -I include $< -o build/[email protected]
Wenn ich laufen lassen jetzt bekomme ich die follwing Ausgabe:
[email protected]:~/code/projects/boardG$ make
g++ -c -o main.o src/main.cpp
src/main.cpp:2:27: fatal error: board/board.hpp: No such file or directory
compilation terminated.
<builtin>: recipe for target 'main.o' failed
make: *** [main.o] Error 1
Mein Projekt der folgende Städte Struktur/Dateien enthält.
./bin/
./build/
./include/board/board.hpp
./src/main.cpp
./src/board/board.cpp
./makefile
Ich frage mich, warum make den Befehl ändern würde, wenn Mustervergleich verwendet wird? Oder, und wahrscheinlich genauer, was mache ich falsch, das macht scheitern?
Das verwendet wahrscheinlich die integrierte '% .o:% .cpp'-Regel, da die'% .hpp'-Datei nicht gefunden werden kann, um mit Ihrem Ziel übereinzustimmen. Deaktivieren Sie diese Regeln ('-r') und Sie sollten sehen, dass es anders scheitert. Das Ausführen von 'make -d' kann nützlich sein, um Ihnen zu zeigen, was make versucht, wenn es Ihre Ziele findet. (Ich bin mir nicht sicher, wie VPATH mit mehreren Mustervoraussetzungen in einem einzigen Ziel spielt.) –
Sie haben einige Regeln, die andere Dateien als die Dateien erstellen, die sie zu bauen versprechen (zB 'build/board.o' statt' board.o. '), und eine andere Regel, die mit dieser Fiktion spielt, indem behauptet wird, dass die Dateien, die nicht erstellt werden, und dann die Dateien verwenden, die sind. Natürlich bricht dies, sobald Sie versuchen, es zu verallgemeinern. – Beta