C++ C/C++;Makefile:如何在with.c文件和其他目录中的对象文件之间建立依赖关系?

C++ C/C++;Makefile:如何在with.c文件和其他目录中的对象文件之间建立依赖关系?,c++,object,makefile,dependencies,C++,Object,Makefile,Dependencies,以下是我的.c和.o文件层次结构: ---/src/IRBuild/main.c func1.c func2.c ---/inclue/main.h func1.h func2.h ---/build/IRBuild/main.o func1.o func2.o irbuild

以下是我的.c和.o文件层次结构:

---/src/IRBuild/main.c
                func1.c
                func2.c
---/inclue/main.h
           func1.h
           func2.h

---/build/IRBuild/main.o
                  func1.o
                  func2.o 
                  irbuild
下面是我在~/src/IRBuild/下的Makefile,我对.c和.h文件有编译依赖关系,这意味着每当.c或.h文件被更改时。“make”将重建对象文件。但是因为我将.o文件输出到~/build/IRBuild/,所以每次生成时,“make”都会重新生成所有的.o文件,而不是当前目录

我应该如何与其他目录中的.o文件建立依赖关系?仅当.c、.h或.o文件发生更改时才重新编译特定文件

在这里呆了两天,非常感谢

EXE=irbuild
#G++作为默认编译器
CC=g++
#编译时标志
CXXFLAGS=-g-墙
#除/usr/lib之外的库路径
LFLAGS=-std=c++0x
#要链接到可执行文件的库:
#LIBS=-lmylib-lm
#包含文件目录,而不是/usr/Include
INCLUDES=-I..//包括/
SRC=$(通配符*.cpp)
OBJ=$(SRC:.cpp=.o)
DEP=$(对象:.o=.d)
BUILD=../BUILD/IRBuild
测试=../../TESTS/
OBJS:=$(每个obj,$(obj),$(构建)/$(obj))
.虚假:依赖清洁
全部:$(EXE)
cp$(EXE)$(测试)
$(EXE):$(OBJ)
$(CC)$(cxflags)$(LFLAGS)$(包括)-o$(EXE)$(OBJS)
.cpp.o:
$(CC)$(CXXFLAGS)$(LFLAGS)$(包括)-c$<-o$(构建)/$@
清洁:
rm-f$(OBJS)$(DEP)$(EXE)
依赖:。依赖
.depend:$(SRC)
rm-f./.取决于
$(CC)$(CXXFLAGS)$(LFLAGS)$(包括)-MM$^-MF./.dependent;
包括,取决于

您违反了
http://make.mad-scientist.net/rules.html
这就是为什么它总是在认为它们不存在的时候重建它们。(在prereqs中列出
$(OBJ)
,在配方链接行中列出
$(OBJS)
,也有点像makefile的“味道”。)

您需要使用从目标文件到其先决条件的正确映射规则

手动或使用
vpath

有许多方法可以使手动方法工作,这取决于您在设置过程中要投入的精力。
vpath
方法可能更容易一些


使用
vpath
应该只需要使用
$(OBJS)
作为
$(EXE)
prereqs,然后添加
vpath%.cpp.
vpath%.h././包括
之类的东西。

谢谢你,埃坦,你的意思是说这条规则违反了规则2吗<代码>代码
.cpp.o:$(CC)$(cxflags)$(LFLAGS)$(包括)-c$<-o$(构建)/$@
代码
如何更改它??如果我删除$(BUILD),则$@只生成对象文件本身,其中没有路径信息。vpath正在处理预需求,对吗?但我说的是依赖关系,我怎样才能用其他目录中的.o文件构建依赖关系?是的,就是这一行。您的配方需要精确生成
$@
而不是它的变体。正确,
vpath
用于预需求。这就是为什么当我提到我说你使用
$(OBJS)
作为prereq的原因,因为在文件名中有
$(BUILD)
路径,然后你让
vpath
找到那些对象文件的匹配源。Etan,它工作了!我添加了“vpath%.o.././build/IRBuild”,然后它就可以工作了!非常感谢。我没有15个声誉,所以我不能投票支持你。如果你在后缀规则中从
$@
中删除
$(BUILD)
,然后添加
vpath
指令,我想它可能会起作用。我不会那样做,但如果成功了就成功了。你应该能够接受答案,即使你不能投票。