2017-06-02 5 views
-1

Erstens - ich weiß, dass es viele ähnliche Diskussionen gibt, aber ich habe Stunden damit verbracht, ohne dass sie für mich arbeiten.GNU make im neu erstellten Unterverzeichnis

Meine Makefile erstellt zuerst ein Verzeichnis mit dem aktuellen Datum und Uhrzeit benannt. Ich habe dann das Makefile an eine Header-Datei eine Zeile anhängen, die eine Zeichenfolge mit diesem Verzeichnisnamen erstellt. Aus diesem Grund muss ich zunächst alle Quelldateien (einschließlich des Headers) in das neu erstellte Unterverzeichnis kopieren, damit ich den ursprünglichen Header beibehalten und nur den Header (im Unterverzeichnis) ändern kann, der für die Kompilierung verwendet wird. Ich möchte dann dieses neue Verzeichnis einbauen.

Mein Problem wird gemacht, um die .o Dateien im neuen Unterverzeichnis richtig zu erstellen. Die Lösung, die ich gefunden habe, ist

$(NOW)%.o: $(NOW)%.cpp $(CC) -c $(FLAGS) $<

haben, wo $(NOW)$ das Unterverzeichnis Name ist. Das Problem ist, dass meine $(FLAGS) scheinen ignoriert zu werden: die Ausgabe ist, grob

g++ -c -o <.o file> <.cpp file>

(Ja, es gibt tatsächlich mehr Platz eingeführt zwischen g++ und -c.) In der obersten Ebene a la Gebäude

%.o: %.cpp $(CC) -c $(FLAGS) $<

korrekt ausgibt

g++ -c <my flags> -o <.o file> <.cpp file>

Zusammenfassend kann ich nicht normal kompilieren, indem ich die Quelldateien in ein neu erstelltes Unterverzeichnis verschiebe und die .o Dateien in diesem Verzeichnis erstelle. TYIA.

+2

Geben Sie die Zeile ein, in der '$ (FLAGS)' gesetzt ist. Wenn es sich um eine zielspezifische Variable handelt, könnte dies zu dem von Ihnen beschriebenen Problem führen. Wenn es mit ': =' gesetzt wird und _below_ das '$ (NOW)%. O' Ziel ist, wird sein Wert in dieser Regel nicht wirksam. Ein vollständigeres Makefile würde definitiv helfen, das Problem zu diagnostizieren. – blackghost

Antwort

-1

Ad John weist darauf hin, dass es keine Möglichkeit gibt, Ihr Problem mit dem kleinen Makefile, das Sie zur Verfügung stellen, definitiv zu diagnostizieren, da der Fehler nicht in dem von Ihnen bereitgestellten Code liegt, sondern in einem anderen Teil Ihres Makefiles. Sie müssen idealerweise eine SSCCE bereitstellen, aber wenn nicht, dann müssen wir zumindest sehen, wie die NOW Variable gesetzt ist und die Linker-Regel, so dass wir wissen, was make versucht zu bauen.

Ich sollte auch darauf hinweisen, dass Sie per Konvention CC nicht verwenden sollten, um den C++ - Compiler zu halten; Die CC Variable enthält den C-Compiler. Verwenden Sie CXX für den C++ - Compiler und CXXFLAGS für die C++ - Compiler-Flags.

Eine Möglichkeit besteht darin, dass Sie die Variable NOW mit einer rekursiven Zuweisung zuweisen, sodass der Zeitstempel jedes Mal neu erstellt wird, wenn die Variable ausgewertet wird. Es kann sein, dass sich der Zeitstempel über die Lebensdauer des Makefiles ändert.

Das andere sehr häufige Problem ist, dass Sie die Musterregel erstellt haben, aber make verwendet sie nicht, weil die Ziele, die erstellt werden sollen, nicht mit dem Muster übereinstimmen.

So zum Beispiel, wenn Ihr Link sieht wie folgt aus:

SRCS = foo.cpp 
OBJS = $(SRC:.cpp=.o) 

myprog: $(OBJS) 
     $(CXX) ... 

$(NOW)%.o : $(NOW)%.cpp 
     $(CXX) ... 

dann wird Ihr Muster nicht angepasst werden, da make versucht, die Datei foo.o und die Regel sagt, es zu bauen, wie $(NOW)foo.o zu bauen, das ist nicht dasselbe.