我不确定我在这里做错了什么。我正在努力弄清楚我的项目有哪些依赖项,不仅是源文件,还包括非系统包含的头文件。我从这个与此主题相关的网站提供了很多资源。
例如:Makefile header dependencies和Makefile, 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,不会重新生成包含此标头的源文件。我错过了什么?
安迪
答案 0 :(得分:4)
首先,您不能在后缀规则中包含先决条件。即使你可以,你肯定不想要包含$(SOURCES)
或$(DEPENDENCIES)
,因为这会导致每个对象在时重建任何源或依赖项文件都已更改。
其次,您无法在与make期望的目录不同的目录中创建目标文件。 Make会将它放在想要在变量$@
中找到目标的位置,并且必须将输出完全写入该位置。如果您看到修改目标的规则,例如上面您使用obj/$@
的地方,则无法使用。
GCC最有可能将文件写为obj/foo.d
,但您的include
正在尝试包含foo.d
,但这不存在......但是因为您使用了{{1} } make不抱怨。
我建议您首先将目标文件写入本地目录,然后使用依赖项。一旦工作,然后阅读如何将目标写入不同的目录和/或再次询问。
ETA:
尝试这样的事情:
-include