当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会如何影响它?
答案 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
的目录中)忽略任何内容。