2016-04-12 17 views
2

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?

+2

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.) –

+0

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

Antwort

0

Vermeiden Sie einfach VPATH, wenn es um Objektdateien geht. Was passiert, ist, dass make die integrierte Regel für %.o verwendet und Ihre Regel überhaupt nicht verwendet.

Wenn Sie alle Ihre Objekte mit dem Verzeichnispräfix, sollte diese Arbeit:

CC=g++ 
OBJDIR = build 
OBJECTS = $(OBJDIR)/main.o $(OBJDIR)/board.o 
VPATH = src:\ 
      src/board:\ 
      include/board:\ 

bin/boardG : $(OBJECTS) 
    $(CC) -o [email protected] $^ 

$(OBJDIR)/%.o : %.cpp %.hpp 
    $(CC) -c -I include $< -o [email protected] 

hier ein helpful resource ist, die mehr oder weniger genau das Problem, das Sie in haben laufen beschreibt.

+0

Es ist erwähnenswert, dass es nichts falsch daran ist, mit VPATH * Objektdateien * als solche zu finden. Das Problem ist, dass VPATH keine Hilfe bei der Suche nach Dateien bietet, die noch nicht existieren. – Beta

+0

Ich erhalte jetzt leider einen neuen Fehler: "... Keine Regel, um das Ziel 'build/main.o' zu machen, das von 'bin/boardG' benötigt wird ...". Wie auch immer, die von Ihnen zur Verfügung gestellte Ressource ist sehr interessant. Vor allem [Pauls Makefile-Regeln] (http://make.mad-scientist.net/papers/rules-of-makefiles/) helfen sehr. Laut dem [dritten] (http://make.mad-scientist.net/papers/rules-of-makefiles/#rule3) sollten Ziele im aktuellen Verzeichnis erstellt werden, daher mache ich mein Leben unnötig kompliziert es scheint. Ich werde etwas zusammenstellen, das diese Regel respektiert und sieht, was das Ergebnis ist. – Pat

+0

Ok, ich habe es jetzt zur Arbeit gebracht. % in der Abhängigkeit entspricht dem Stamm des Ziels. Während des Kompilierens von main.o nimmt make daher an, dass die Abhängigkeit main.hpp ist, während es tatsächlich board.hpp ist. Daher ist es fehlgeschlagen, da main.hpp nicht existiert. Ich habe die Abhängigkeit von% .hpp zu board.hpp geändert und es funktioniert jetzt gut.Ich brauche jetzt einen saubereren Weg, um mit den Abhängigkeiten umzugehen, und einen, der es mir erlaubt, Pauls Regel # 3 nicht zu brechen, aber das ist ein anderes Thema als die vorliegende Frage. @Barry, danke für die Antwort auf mein Problem mit dem Ordner/VPATH. – Pat

Verwandte Themen