在生成文件与使用-MMD G ++来自动生成的依赖关系(Using g++ with -MMD in

2019-06-26 20:08发布

我知道下面的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)

Answer 1:

据推测,命令,如${CXX} ${CXXFLAGS} -c xC -o xo将通过为每个对象文件的自动推断,但如果这些都是生成.d文件中的命令,难道我们已经通过这种地步知道XO,YO和ZO的依赖关系可以一直相关的,如果我们只通过执行产生这些.o文件的命令认识他们吗?

你是正确的位置。 该依赖关系不存在,第一次运行makefile。

但是,这并不重要 - 当.o文件已经存在,才需要依赖信息,并且你已经改变了.h文件。 运行make第一次,所有的.o文件将需要反正建成,将.d文件在同一时间产生的。

在此之后,.d文件会给依赖信息。 如果头被改变,相依性信息会告诉请其.o文件需要重建。 如果源文件被改变时,会的.o总是需要重建,并更新依赖信息将同时产生。



Answer 2:

如果你永远不知道什么是被你的背后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通常设置为不同的编译器,太)。



Answer 3:

是的,你说得对,如果删除了相关文件,但留在原地的目标文件,然后进行将不完全依赖信息来运行,并且可能无法重新建立其头部已经改变了目标文件。

请还可以拒绝建立 - 这发生在依赖文件引用您已删除(显然来自任何其他来源不再引用)的标题。 作为补充不知道如何依赖文件重建编译之前,一切能做的就是报告缺少的依赖(然后是明显的动作是删除相关文件,导致第一个条件,上文)。

这个唯一的答案就是纪律:删除相关文件时,总是删除目标文件。 您可以使用clean目标,以帮助这一点。

clean::
        $(RM) *.o *.d

或者另外,告诉制作如何创建依赖文件:

%.dep: %.cc
        $(CXX) -MM $(CPPFLAGS) $< | sed -e 's,\($*\)\.o[ :]*,\1.o $@: ,g' > $@

(在sed命令可以确保依赖本身依赖于作为对象文件做同样的来源)。



文章来源: Using g++ with -MMD in makefile to automatically generate dependencies