Makefile GNU使模式在不同于src的目录中生成输出

Makefile GNU使模式在不同于src的目录中生成输出,makefile,gnu-make,Makefile,Gnu Make,我正在尝试创建一个Makefile,它将我的.o文件放置在与源文件不同的目录中。我尝试使用模式规则,这样就不必为每个源和对象文件创建相同的规则 我的项目结构类似于: project/ + Makefile + src/ + main.cpp + video.cpp + Debug/ + src/ [contents built via Makefile:] + main.o + video.o OBJDIR_DEBUG = Debug O

我正在尝试创建一个Makefile,它将我的
.o
文件放置在与源文件不同的目录中。我尝试使用模式规则,这样就不必为每个源和对象文件创建相同的规则

我的项目结构类似于:

project/
 + Makefile
 + src/
   + main.cpp
   + video.cpp
 + Debug/
   + src/       [contents built via Makefile:]
     + main.o
     + video.o
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 $@
我的Makefile看起来像:

project/
 + Makefile
 + src/
   + main.cpp
   + video.cpp
 + Debug/
   + src/       [contents built via Makefile:]
     + main.o
     + video.o
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 $@
#坏掉了:
#Makefile:70:目标'src/main.o'与目标模式不匹配
#Makefile:70:目标'src/video.o'与目标模式不匹配
#在目标规则中添加OBJDIR_调试
OBJ=src/main.o src/video.o
$(OBJ):$(OBJDIR_DEBUG)/%.o:%.cpp
$(CXX)$(CFLAGS\u DEBUG)$(INC\u DEBUG)-c$<-o$@
在重新阅读之后,我导出了以下似乎有效的模式规则

$(OBJ_DEBUG): $(OBJDIR_DEBUG)/%.o: %.cpp
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o $@
$(OBJ_调试):$(OBJDIR_调试)/%.o:%.cpp
$(CXX)$(CFLAGS\u DEBUG)$(INC\u DEBUG)-c$<-o$@

我不确定这是否是最好的方法,我愿意接受建议。

您可以尝试从另一个目录中的源代码构建对象,而不是在另一个目录中构建对象:将makefile放在对象将要存在的目录中,并告诉make使用VPATH在其他目录中查找源代码。如果所有对象文件都应该在同一个目录中结束,那么这种方法效果最好。

通过在每个源上运行GCC,在单独的生成目录中“复制”源树的Makefile-

如果在OBJDIR\u DEBUG中有子目录,会发生什么?我猜编译会失败,因为输出目录不存在。