gpt4 book ai didi

c++ - g++ 生成依赖文件缺少用户定义的 header

转载 作者:太空狗 更新时间:2023-10-29 11:49:32 26 4
gpt4 key购买 nike

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

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/c.h'替换为'c.h',我可以获得正确的依赖文件(意味着'c.h'在依赖文件中)。

有谁知道第一个进程缺少 header 依赖项的原因吗?

最佳答案

根据 this GCC webpage ,

"preprocessor looks for header files included by the quote form of the directive #include "file" first relative to the directory of the current file, and then in a preconfigured list of standard system directories."

这意味着当它看到 #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++ 并仍然获得相同的构建结果。

关于c++ - g++ 生成依赖文件缺少用户定义的 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45338934/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com