【问题标题】:g++ generate dependency file miss user defined headersg ++生成依赖文件错过用户定义的头文件
【发布时间】:2018-01-02 11:36:11
【问题描述】:

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

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' by

   #include "c/c.h".

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

有谁知道第一个进程漏掉头依赖的原因吗?

【问题讨论】:

    标签: c++ linux dependencies g++


    【解决方案1】:

    这个奇怪的输出是由变量 CPLUS_INCLUDE_PATH 引起的。我已将其设置为以下值:

    CPLUS_INCLUDE_PATH=some_path:
    

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

    CPLUS_INCLUDE_PATH=some_path
    

    那么问题就解决了。

    【讨论】:

      【解决方案2】:

      根据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 选项指定的目录按从左到右的顺序扫描。

      请注意,您运行 g++ 的目录并未出现在上述列表中。这意味着,预处理器检查您在命令行上运行 g++ 的目录。原因是您可以从任何目录运行 g++ 并仍然获得相同的构建结果。

      【讨论】:

      • 我同意你所说的大部分内容。 -I../ 不起作用。此外,将 -I 绝对路径添加到“src”折叠也不起作用。
      • @user3677630 - 如果它不起作用,那么你为什么接受这个答案?也许你应该让这个问题多留一些时间,看看其他人是否知道这个问题的答案。
      • @jww “-I../”部分只是答案的一小部分。其余部分仍然有效。只要这个答案的一部分解决了问题,就是正确的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 2012-06-25
      • 2011-01-24
      • 1970-01-01
      • 2018-08-03
      • 2020-06-23
      • 1970-01-01
      相关资源
      最近更新 更多