我知道下面的 makefile 将有预处理器自动生成依赖关系 (在.d 文件中),并将它们包含在 makefile 中 (因为我的课程笔记这样说),这样它们就不必自动维护。-MMD
标志是对此负责的。我没有得到的是:在什么点是.d 文件生成的?甚至没有任何命令,其中
CXX = g++ # compiler
CXXFLAGS = -g -Wall -MMD # compiler flags
OBJECTS = x.o y.o z.o # object files forming executable
DEPENDS = ${OBJECTS:.o=.d} # subsutes ".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 x.C -o x.o
这样的命令将由 make 自动推导出每个目标文件,但是如果这些是生成.d 文件的命令,那么我们是否已经过了知道 x.o,y.o 和 z.o 的依赖关系可能是相关的,如果我们只通过执行生成这些.o 文件的命令来知道它们?
你在这里是正确的。第一次运行 Makefile 时不存在依赖项。
但这并不重要-只有当.o 文件已经存在并且您已经更改了.h 文件时,才需要依赖关系信息。第一次运行 Make 时,无论如何都需要构建所有.o 文件,并且同时生成.d 文件。
之后,.d 文件将提供依赖信息。如果更改了标头,则依赖信息将告诉 Make 需要重建哪些.o 文件。如果更改了源文件,则始终需要重建.o,同时将生成更新的依赖信息。
如果你想知道背后的 makefile 做了什么,使用-p 标志,并将输出重定向到一个文件,因为它是一吨的东西。
make -p foo > bar
会将所有变量值和规则转储到make foo
中,然后查看bar
将显示您的.cpp.o
或%.o: %.cpp
(奇怪的是,它们都在那里)规则将调用$(COMPILE.cpp)
。
是的,你是对的,如果你删除依赖文件,但离开对象文件的地方,然后使将运行不完整的依赖信息,并可能无法重新构建其标题已更改的对象文件。
Make 也可能拒绝构建-当依赖项文件引用您已删除的标头时(显然不再从任何其他来源引用),就会发生这种情况。由于 Make 不知道如何在编译之前重建依赖项文件,因此它所能做的就是报告缺少的依赖项(然后显而易见的操作是删除依赖项文件,导致上面的第一个条件)。
唯一的答案是纪律:删除依赖文件时,始终删除对象文件。您可以使用clean
目标来帮助解决这个问题。
clean::
$(RM) *.o *.d
或者另外,告诉 Make 如何创建依赖项文件:
%.dep: %.cc
$(CXX) -MM $(CPPFLAGS) $< | sed -e 's,\($*\)\.o[ :]*,\1.o $@: ,g' > $@
(sed
命令确保依赖关系本身依赖于与对象文件相同的源)。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(78条)