2012-11-25 5 views
25

Próbuję utworzyć plik Makefile, który umieszcza moje pliki .o w innym katalogu niż moje pliki źródłowe. Próbuję użyć reguły wzorca, więc nie muszę tworzyć identycznych reguł dla każdego pliku obiektu źródłowego &.GNU Utwórz wzorzec, aby utworzyć dane wyjściowe w innym katalogu niż src

Moja struktura projektu wyglądał:

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

My Makefile wyglądał:

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] 

to nie zadziała, ponieważ wygląda na moich plików źródłowych w Debug/src/*.cpp.

Próbowałem następujące:

# 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] 

Odpowiedz

23

Po ponownym przeczytaniu documentation on static pattern rules, że pochodzi następującą regułę wzór, który wydaje się działać.

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

nie jestem pewien, że to najlepsze podejście, i jestem otwarty na sugestie.

+3

To najlepsze podejście. – Beta

+1

Co się stanie, jeśli masz podkatalogi w OBJDIR_DEBUG? Domyślam się, że kompilacja zakończy się niepowodzeniem, ponieważ katalog wyjściowy nie istnieje. – aardvarkk

3

Zamiast budować obiekty w innym katalogu, możesz spróbować budować obiekty ze źródeł z innego katalogu: umieść plik makefile w katalogu, w którym znajdują się obiekty, i powiedz make, aby szukał źródeł gdzie indziej przy użyciu VPATH. Działa to najlepiej, jeśli wszystkie pliki obiektów powinny znaleźć się w tym samym katalogu.