2012-11-25 3 views
25

Ich versuche ein Makefile zu erstellen, die meine .o Dateien in einem anderen Verzeichnis als meine Quelldateien platziert. Ich versuche, eine Musterregel zu verwenden, damit ich nicht für jede Quelle & Objektdatei identische Regeln erstellen muss.GNU Make-Muster zum Erstellen von Ausgabe in einem anderen Verzeichnis als src

Meine Projektstruktur sieht ungefähr so ​​aus:

project/ 
+ Makefile 
+ src/ 
    + main.cpp 
    + video.cpp 
+ Debug/ 
    + src/  [contents built via Makefile:] 
    + main.o 
    + video.o 

Mein Make etwas wie folgt aussieht:

OBJDIR_DEBUG = Debug 
OBJ_DEBUG = $(OBJDIR_DEBUG)/src/main.o $(OBJDIR_DEBUG)/src/video.o 

all: $(OBJ_DEBUG) 

$(OBJ_DEBUG): %.o: %.cpp 
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o [email protected] 

Das funktioniert nicht, weil es für meine Quelldateien auf Debug/src/*.cpp aussieht.

Ich habe versucht, die folgenden:

# Broken: make: *** No rule to make target `Debug/src/main.cpp', needed by `Debug/src/main.o'. Stop. 
# As a test, works if I change "%.cpp" to "Debug/src/main.cpp", though it obv. builds the wrong thing 

# Strip OBJDIR_DEBUG from the start of source files 
$(OBJ_DEBUG): %.o: $(patsubst $(OBJDIR_DEBUG)/%,%,%.cpp) 
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o [email protected] 

# Broken: 
# Makefile:70: target `src/main.o' doesn't match the target pattern 
# Makefile:70: target `src/video.o' doesn't match the target pattern 

# Add OBJDIR_DEBUG in target rule 
OBJ = src/main.o src/video.o 

$(OBJ): $(OBJDIR_DEBUG)/%.o: %.cpp 
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o [email protected] 

Antwort

23

Nach dem documentation on static pattern rules Re-Lektüre, ich abgeleitet das folgende Muster Regel, die zu funktionieren scheint.

$(OBJ_DEBUG): $(OBJDIR_DEBUG)/%.o: %.cpp 
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o [email protected] 

Ich bin mir nicht sicher, das ist der beste Ansatz, und ich bin offen für Vorschläge.

+3

dass der beste Ansatz ist. – Beta

+1

Was passiert, wenn Sie in OBJDIR_DEBUG Unterverzeichnisse haben? Meine Vermutung ist, dass die Kompilierung fehlschlägt, weil das Ausgabeverzeichnis nicht existiert. – aardvarkk

3

Anstatt Objekte in einem anderen Verzeichnis zu erstellen, können Sie versuchen, Objekte aus Quellen in einem anderen Verzeichnis zu erstellen: legen Sie Ihr Makefile in das Verzeichnis, in dem die Objekte stehen sollen, und geben Sie make an, mit VPATH nach Quellen zu suchen. Dies funktioniert am besten, wenn alle Objektdateien im selben Verzeichnis landen sollen.

Verwandte Themen