繁体   English   中英

g ++生成依赖文件缺少用户定义的标头

[英]g++ generate dependency file miss user defined headers

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

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

“ ch”声明一个名为“ B”的类,“ c.cpp”定义该类“ B”。

假设我们现在位于文件夹“ src”中。 我跑

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

为“ c / c.cpp”生成依赖文件“ c / cd”。 但是,即使我已经在“ c / c.cpp”中的“ c / ch”中包含了“ c / ch”,文件“ c / c.d”的内容也不包含“ c / ch”。

   #include "c/c.h".

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

任何人都知道为什么第一个进程错过标头依赖性的原因吗?

根据此GCC网页

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

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

当您用#include "ch"替换它时,预处理器将检查当前文件的目录。

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

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

  1. 对于include指令的引号形式,将首先搜索当前文件的目录。
  2. 对于include指令的引号形式,由-iquote选项指定的目录按从左到右的顺序搜索,就像它们出现在命令行上一样。
  3. 用-I选项指定的目录以从左到右的顺序扫描。
  4. 用-isystem选项指定的目录以从左到右的顺序扫描。
  5. 扫描标准系统目录。
  6. 用-idirafter选项指定的目录以从左到右的顺序扫描。

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

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

CPLUS_INCLUDE_PATH=some_path:

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

CPLUS_INCLUDE_PATH=some_path

那么问题就解决了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM