我知道下面的Makefile将有预处理器自动生成的依赖关系(在.d文件),并将其包含在生成文件(因为我的课堂笔记说的话),让他们不必被自动维护做。 该-MMD
标志是什么是负责这一点。 我不明白的是:在什么时候产生的.d文件? 甚至没有任何地方的命令${CXXFLAGS}
使用。 据推测,命令,如${CXX} ${CXXFLAGS} -c xC -o xo
将通过为每个对象文件的自动推断,但如果这些都是生成.d文件中的命令,难道我们已经通过这种地步知道XO,YO和ZO的依赖关系可以一直相关的,如果我们只通过执行产生这些.o文件的命令认识他们吗? (说有.h文件,如果留下来推断其本身或某事规则的生成文件会忽略。)
CXX = g++ # compiler
CXXFLAGS = -g -Wall -MMD # compiler flags
OBJECTS = x.o y.o z.o # object files forming executable
DEPENDS = ${OBJECTS:.o=.d} # substitutes ".o" with ".d"
EXEC = a.out # executable name
${EXEC} : ${OBJECTS} # link step
${CXX} ${OBJECTS} -o ${EXEC}
-include ${DEPENDS} # copies files x.d, y.d, z.d (if they exist)
据推测,命令,如${CXX} ${CXXFLAGS} -c xC -o xo
将通过为每个对象文件的自动推断,但如果这些都是生成.d文件中的命令,难道我们已经通过这种地步知道XO,YO和ZO的依赖关系可以一直相关的,如果我们只通过执行产生这些.o文件的命令认识他们吗?
你是正确的位置。 该依赖关系不存在,第一次运行makefile。
但是,这并不重要 - 当.o文件已经存在,才需要依赖信息,并且你已经改变了.h文件。 运行make第一次,所有的.o文件将需要反正建成,将.d文件在同一时间产生的。
在此之后,.d文件会给依赖信息。 如果头被改变,相依性信息会告诉请其.o文件需要重建。 如果源文件被改变时,会的.o总是需要重建,并更新依赖信息将同时产生。
如果你永远不知道什么是被你的背后makefile文件完成后,使用-p标志,并将输出重定向到一个文件,因为它是一吨的东西。
make -p foo > bar
将倾出所有的变量值和规则的make foo
,然后在找bar
会告诉你什么命令的潜规则运行。 在你的情况下,它会显示你的.cpp.o
或%.o: %.cpp
(奇怪的是,他们俩都存在)规则将调用$(COMPILE.cpp)
解析为$(COMPILE.cc)
这样就解决了到$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
。 这已经是可以添加的东西要么CXXFLAGS或CPPFLAGS让他们进入你的.cpp.o有趣的财产编译,但不是CFLAGS,其仅用于由.co
规则,这让人有点感觉的,因为你可能希望你的不同地处理C文件和C ++文件(CC和CXX通常设置为不同的编译器,太)。
是的,你说得对,如果删除了相关文件,但留在原地的目标文件,然后进行将不完全依赖信息来运行,并且可能无法重新建立其头部已经改变了目标文件。
请还可以拒绝建立 - 这发生在依赖文件引用您已删除(显然来自任何其他来源不再引用)的标题。 作为补充不知道如何依赖文件重建编译之前,一切能做的就是报告缺少的依赖(然后是明显的动作是删除相关文件,导致第一个条件,上文)。
这个唯一的答案就是纪律:删除相关文件时,总是删除目标文件。 您可以使用clean
目标,以帮助这一点。
clean::
$(RM) *.o *.d
或者另外,告诉制作如何创建依赖文件:
%.dep: %.cc
$(CXX) -MM $(CPPFLAGS) $< | sed -e 's,\($*\)\.o[ :]*,\1.o $@: ,g' > $@
(在sed
命令可以确保依赖本身依赖于作为对象文件做同样的来源)。