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文件中的依赖项。
如果--sysroot是相对的,那么两个额外的头文件不再被列为.d文件中的依赖项。
这让我想知道,除了包含了一个头之外,还有什么条件,.d文件实际上是由编译器编写的,而sysroot将如何影响这一点呢?
发布于 2014-04-20 16:30:45
据我所知,它基于找到文件的实际目录。
实际的“让这成为一个依赖”发生在这里,其中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
的目录中)。
https://stackoverflow.com/questions/23182778
复制相似问题