为什么不检测标头依赖性的变化

时间:2013-04-25 18:14:22

标签: makefile gnu-make

我不确定我在这里做错了什么。我正在努力弄清楚我的项目有哪些依赖项,不仅是源文件,还包括非系统包含的头文件。我从这个与此主题相关的网站提供了很多资源。

例如:Makefile header dependenciesMakefile, header dependencies

但是,当我这样做时

touch MyHeader.h

作为测试是否有效,我的make进程无法重建包含此标头的源文件。所以,这就是我在makefile中的相关内容(相关的)

CPP=g++
CPPFLAGS=-Iadditional/includes -MMD
CXXFLAGS=-std=c++0x -c 
# not every source file in this directory needs to be included in this build
# this is because of shared code with Windows
SOURCESFILTER = File1.cpp File2.cpp

OBJ_DIR=obj
SOURCES = $(filter-out $(SOURCEFILTER),$(wildcard *.cpp))
OBJECTS = $(addprefix $(OBJ_DIR)/,$(SOURCES:.cpp=.o))

DEPENDENCIES = $(OBJECTS:.o=.d)

.PHONY: archive

archive : $(OBJECTS)
    ar mylib.a obj/*.o

-include $(DEPENDENCIES)

$(OBJ_DIR)/%.o: $(SOURCES) $(DEPENDENCIES)
    $(CPP) $(CPPFLAGS) $(CXXFLAGS) $< -o $@

我已经验证上述过程确实生成了预期的* .d文件。我假设我正确地包括它们。但是,如上所述,作为测试,我做了:     触摸MyHeader.h

与源位于同一目录中,并重新运行make,不会重新生成包含此标头的源文件。我错过了什么?

安迪

1 个答案:

答案 0 :(得分:4)

首先,您不能在后缀规则中包含先决条件。即使你可以,你肯定想要包含$(SOURCES)$(DEPENDENCIES),因为这会导致每个对象在时重建任何源或依赖项文件都已更改。

其次,您无法在与make期望的目录不同的目录中创建目标文件。 Make会将它放在想要在变量$@中找到目标的位置,并且必须将输出完全写入该位置。如果您看到修改目标的规则,例如上面您使用obj/$@的地方,则无法使用。

GCC最有可能将文件写为obj/foo.d,但您的include正在尝试包含foo.d,但这不存在......但是因为您使用了{{1} } make不抱怨。

我建议您首先将目标文件写入本地目录,然后使用依赖项。一旦工作,然后阅读如何将目标写入不同的目录和/或再次询问。

ETA:

尝试这样的事情:

-include