g ++生成依赖文件未命中用户定义的标头

时间:2017-07-26 23:19:19

标签: c++ linux dependencies g++

我的源代码文件夹的结构定义如下:

src
 |--c
    |--c.h
    |--c.cpp

'c.h'声明一个名为'B'的类,'c.cpp'定义了'B'类。

假设我们现在在文件夹'src'中。我跑

   g++ -I./ -MM -MT c/c.o -MF c/c.d c/c.cpp

为'c / c.cpp'生成依赖文件'c / c.d'。然而,文件'c / c.d'的内容不包含'c / c.h',即使我在'c / c.cpp'中包含了'c / c.h'

   #include "c/c.h".

但是,如果我们在文件夹'c'中并运行上述命令,结果会有所不同。通过在上面的过程中用'c.h'替换'c / c.h',我可以获得一个正确的依赖文件(意味着'c.h'在依赖文件中)。

任何人都知道为什么第一个进程错过了头依赖?

2 个答案:

答案 0 :(得分:3)

根据this GCC webpage

  

"预处理器首先查找指令#include "file" 的引用形式所包含的头文件,相对于当前文件的目录,然后在预先配置的标准列表中查找系统目录。"

这意味着当它看到#include "c/c.h"时,会检查名为" c"的假设子目录中的文件。从当前文件的位置。

当您用#include "c.h"替换它时,预处理器然后检查当前文件的目录。

另一个选择是将-I../添加到g ++的命令行参数中。

This GCC webpage提供预处理器在目录中搜索包含文件的完整顺序。查找顺序如下:

  1. 对于include伪指令的引用形式,首先搜索当前文件的目录。
  2. 对于include伪指令的引用形式,-iquote选项指定的目录按从左到右的顺序搜索,因为它们出现在命令行中。
  3. 使用-I选项指定的目录按从左到右的顺序扫描。
  4. 使用-isystem选项指定的目录按从左到右的顺序扫描。
  5. 扫描标准系统目录。
  6. 使用-idirafter选项指定的目录按从左到右的顺序扫描。
  7. 请注意,运行g ++的目录不会出现在上面的列表中。这意味着,预处理器检查在命令行上运行g ++的目录。原因是您可以从任何目录运行g ++并仍然获得相同的构建结果。

答案 1 :(得分:0)

这个奇怪的输出是由变量CPLUS_INCLUDE_PATH引起的。我在下面将它设置为某个值:

CPLUS_INCLUDE_PATH=some_path:

变量CPLUS_INCLUDE_PATH的尾部':'是我的问题的原因。使用':',编译器将'./'视为系统文件夹,因此它会从依赖项列表中自动删除与'./'相关的标题,例如'c / c.h'。因此,如果我将CPLUS_INCLUDE_PATH设置为

CPLUS_INCLUDE_PATH=some_path
然后问题就解决了。