gcc -MMD 如何写入 .d 文件?

Posted

技术标签:

【中文标题】gcc -MMD 如何写入 .d 文件?【英文标题】:How does gcc -MMD write .d files? 【发布时间】:2014-04-20 13:04:21 【问题描述】:

gcc 在写入 .d 文件时如何决定将哪些文件列为正在生成的目标文件的依赖项?

当 sysroot 路径是绝对路径和相对路径时,我会看到不同的 .d 文件。

g++ --MMD --sysroot=absolute_path_to_sysroot -c -o file.o -MF file.d file.cpp
g++ --MMD --sysroot=relative_path_to_sysroot -c -o file.o -MF file.d file.cpp

我看到一个奇怪的案例,在哪里, 如果编译器路径和 --sysroot 是绝对的,那么 .d 文件中将另外列出 2 个头文件作为依赖项。

如果 --sysroot 是相对的,则 .d 文件中不再将另外 2 个头文件列为依赖项。

这让我想知道,除了标头被#included 之外,.d 文件实际上是由编译器编写的标准是什么,以及 sysroot 将如何影响这一点?

【问题讨论】:

【参考方案1】:

据我所知,它是基于文件所在的实际目录

实际的“使其成为依赖项”发生在这里,其中sysp 根据所在目录设置在上面几行。

http://gcc.gnu.org/viewcvs/gcc/trunk/libcpp/files.c?revision=206293&view=markup#l884

sysp 在这里设置:

http://gcc.gnu.org/viewcvs/gcc/trunk/gcc/incpath.c?revision=206289&view=markup#l446

现在,如果同一目录同时位于 -I-isystem 目录中,情况就会变得复杂。在这种情况下,它取决于文件是否包含在#include <name>#include "name" 中 - 仅当您使用-MD-M 等时才会选择使用<> 的文件,其中-MMD 将忽略使用<> 的任何内容(或在标有sysp 的目录中)。

【讨论】:

嗯。这很可能是原因。我取出 -I 并让编译器仅从 sysroot 中选择标头,并且其他包含消失了。但是,我仍然想知道为什么 sysroot 目录路径是相对或绝对的。 有代码可以从-I 中删除重复项,但它只会删除相同的条目。因此,根据您的 -I--sysroot 的指定方式,您最终可能会得到实际上指向同一事物但“以不同方式编写”的目录。

以上是关于gcc -MMD 如何写入 .d 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在文件中写入 YAML 格式的数据?

如何从线程只写入一次文件?

php中如何将日志和标签一起写入MYSQL数据库~~~~

如何使用日志记录Python模块写入文件?

将矩阵写入文本文件

如何使用Linux终端(如python,在gcc或g ++中编译一行C ++代码?