Mmd动作:在makefile中使用g++和-MMD自动生成依赖关系

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

据推测,像${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,同时将生成更新的依赖信息。

2

如果你想知道背后的 makefile 做了什么,使用-p 标志,并将输出重定向到一个文件,因为它是一吨的东西。

make -p foo > bar会将所有变量值和规则转储到make foo中,然后查看bar将显示您的.cpp.o%.o: %.cpp(奇怪的是,它们都在那里)规则将调用$(COMPILE.cpp)

0

是的,你是对的,如果你删除依赖文件,但离开对象文件的地方,然后使将运行不完整的依赖信息,并可能无法重新构建其标题已更改的对象文件。

Make 也可能拒绝构建-当依赖项文件引用您已删除的标头时(显然不再从任何其他来源引用),就会发生这种情况。由于 Make 不知道如何在编译之前重建依赖项文件,因此它所能做的就是报告缺少的依赖项(然后显而易见的操作是删除依赖项文件,导致上面的第一个条件)。

唯一的答案是纪律:删除依赖文件时,始终删除对象文件。您可以使用clean目标来帮助解决这个问题。

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

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

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

sed命令确保依赖关系本身依赖于与对象文件相同的源)。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(532)
Opp o 93:使用蓝牙OBEX对象推送配置文件(OPP)发送文件
上一篇
Pivot浏览器:搜狗浏览器的浏览器引擎是什么
下一篇

相关推荐

  • filezilla服务器端配置:如何使用FileZilla服务器配置进行FTP传输

    FileZilla服务器端配置是指在服务器上安装FileZilla服务器软件并进行相关的配置,以便能够使用FileZilla客户端连接到该服务器。…

    2023-03-18 08:41:31
    0 30 71
  • S iwa rent i:解码.iwa文件(.iwa file)

    关于S iwa rent i的问题,在.iwa file中经常遇到,我正在查看我的 Apple Numbers 项目中的.iwa文件的内容。看起来格式是protobuf wrapped in snappy。我想知道是否有一种相对简单 / 粗糙的方式来查看数据的文本内容。我尝试了一个基本的hexdump,但它只是给了我一些胡言乱语,可能是因为编码。…

    2022-11-23 08:41:25
    0 56 74
  • Idea代码报错不提示:FileMaker不提示登录

    关于Idea代码报错不提示的问题,在filemaker login中经常遇到,因此,我将 FileMaker 数据库从具有 FM 服务器 10 的机器移动到具有 FM 服务器 11 的新机器。…

    2024-04-21 12:41:17
    0 89 81
  • Dat文件:游戏编程:.DAT文件 (how to view dat files)

    关于Dat文件的问题,在how to view dat files中经常遇到,我已经看到很多游戏使用类似于.DAT 文件或游戏本身的特定文件类型。我刚刚开始使用 C ++ 和 DirectX,我有兴趣将我的信息保存在类似于.…

    2024-03-16 10:31:53
    0 76 73

发表评论

登录 后才能评论

评论列表(78条)