我正在嘗試創建一個Makefile以便在子目錄中生成目標文件,而不是讓它們在src /文件夾中。 下面是該項目的結構:使用Makefile在子目錄中生成目標文件
Trunk
- Server
- src/
- include/
- Common
- src/
- include/
Makefile文件位於Trunk/Server
。源文件位於無論是在Server/src
和Common/src
,所以Makefile中目前有這樣的事情:
SRC = src/main.cpp \
src/Network.cpp \
../Common/src/SQLManager.cpp \
../Common/src/Utils.cpp
我woud喜歡把生成的目標文件在各自obj
文件夾,因此Trunk/Server/obj
和Trunk/Common/obj
。我怎樣才能做到這一點?我發現了許多方法來在子目錄中生成目標文件(vpath
,patsubst
等等),但我無法讓它們中的任何一個適用於此文件夾組織。
編輯:如果有一種方法可以將所有的目標文件放入Server/obj/
,那也可以。
下面是完整的Makefile文件(減去一些源文件和鏈接庫): EDIT2:更新與迪迪埃Trosset的變化
CXX = g++
RM = rm -vf
NAME = Server
SRC = src/main.cpp \
src/Network.cpp \
../Common/src/SQLManager.cpp \
../Common/src/Utils.cpp
OBJ = $(subst src/,obj/, $(subst .cpp,.o, $(SRC)))
LDFLAGS = -lpthread -lm
CPPFLAGS = -std=c++0x -pedantic -Wextra -Wall -Wconversion -Iinclude -I../Common/include
all: Server
%.o: %.cpp
$(CXX) $< -o [email protected]
Server: $(OBJ)
$(CXX) -o $(NAME) $(OBJ) $(LDFLAGS)
clean:
$(RM) $(OBJ) *~
fclean: clean
$(RM) $(NAME)
re: fclean Server
.PHONY: all clean fclean Server
這樣的問題幾乎每隔一週就會被問到。您是否嘗試過搜索,如果可以,您能解釋爲什麼/如何回答這些問題不適合您? – eriktous 2012-02-13 14:13:20
我曾嘗試搜索,並閱讀這些答案:http://stackoverflow.com/questions/5178125/gnu-make-how-to-get-object-files-in-separate-subdirectory,http:// stackoverflow.com/questions/231229/how-to-generate-a-makefile-with-source-in-sub-directories-using-just-one-makefil。但是文件夾結構不完全相同,Makefile通常根本不起作用(找不到'.cpp',錯誤的命令行...) – Jukurrpa 2012-02-13 14:21:16
另一個問題:爲什麼你認爲這個問題出現了經常這樣做,爲什麼你認爲Makefile通常不起作用?這個方案只有固有的問題;模式規則因爲需要在正確的目錄前面加上前綴而崩潰。爲了保持你的Makefile和你自己的理智,不要這樣做。堅持[Paul的第三條Makefiles規則](http://mad-scientist.net/make/rules.html),或者遷移到更高級的構建系統。 – eriktous 2012-02-13 15:11:14