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 文件?的主要内容,如果未能解决你的问题,请参考以下文章