我正在尝试创建一个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