我正在尝试创建一个Makefile,它将我的.o
文件放在与源文件不同的目录中。我正在尝试使用模式规则,因此我不必为每个源创建相同的规则。对象文件。
我的项目结构类似于:
project/
+ Makefile
+ src/
+ main.cpp
+ video.cpp
+ Debug/
+ src/ [contents built via Makefile:]
+ main.o
+ video.o
我的Makefile看起来像:
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 $@
这不起作用,因为它在Debug/src/*.cpp
查找我的源文件。
我尝试了以下内容:
# 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 $@
# 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 $@
答案 0 :(得分:26)
重新阅读documentation on static pattern rules后,我推导出以下似乎有效的模式规则。
$(OBJ_DEBUG): $(OBJDIR_DEBUG)/%.o: %.cpp
$(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o $@
我不确定这是最好的方法,我愿意接受建议。
答案 1 :(得分:3)
您可以尝试从另一个目录中的源构建对象,而不是在另一个目录中构建对象:将makefile放在对象所在的目录中,并告诉make使用VPATH在其他地方查找源代码。如果所有目标文件都应该在同一目录中,那么这种方法效果最好。
答案 2 :(得分:0)
通过在每个源上运行GCC,在单独的构建目录中“复制”源树的Makefile - https://stackoverflow.com/a/41924169/4224163