gcc -MMD如何写.d文件?

时间:2014-04-20 13:04:21

标签: c++ c gcc compiler-construction

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

当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 个答案:

答案 0 :(得分: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的目录中)忽略任何内容。