【问题标题】:GCC compiler does not search sub-directories when looking for header filesGCC编译器在查找头文件时不搜索子目录
【发布时间】:2020-08-06 14:47:41
【问题描述】:

我无法让 gcc 编译器识别“包含”中的复杂路径。

这是我的玩具“main.cpp”文件(注意包含语句中的子目录):

#include "sub/testlib.h"

int main()
{
    testlib(6);
    return 0;
}

以下是“main.cpp”文件夹中“testlib.h”文件的路径:../lib/sub/testlib.h。

我在编译时指定了包含目录:

gcc -c -iquote../lib main.cpp

编译器对我大喊:

main.cpp:1:10: fatal error: sub/testlib.h: No such file or directory
    1 | #include "sub/testlib.h"
      |          ^~~~~~~~~~~~~~~
compilation terminated.

当然,我可以通过从路径中删除子目录来编译它。但这只是我在编译实际项目失败后所做的一个实验。我不能随意更改那里的文件。

如何强制 gcc 很好地处理包含中的子目录?我在这里缺少标志或某些选项吗?

【问题讨论】:

  • 你可以试试加-I/sub
  • edit 显示每个文件的绝对路径。什么是-iquote../lib
  • @NutCracker,我做到了,但问题仍然存在......
  • @Jabberwocky,我真傻。正如你所建议的,我开始编辑,发现路径不是我想象的那样。我改变了路径,然后它就像一个魅力!感谢您为我节省了数小时的错误猜测和尝试!

标签: c++ gcc compiler-errors include-path


【解决方案1】:

如何强制 gcc 很好地处理包含中的子目录?我在这里缺少标志或某些选项吗?

阅读GCC 的文档,特别是Invoking GCC 章节,preprocessor options 部分(例如-I include-dir-H-M 等...),documentationpreprocessor。也试试g++ --help-I include-directory 标志可以重复很多次,这可能是您需要的。当然,g++ 程序的参数顺序很重要。在编译或链接 C++ 程序时,您可能希望使用 g++ 而不是 gcc

另请阅读 C++ 的 some documentation(甚至可能是 n3337“草案”标准)。请注意translation units,以及linker 的角色。

在实践中,您希望使用一些 build automation 工具来驱动 GCC 编译,例如 GNU makeninja 或许多其他工具。

如果您使用 GNU make,请阅读它的 documentation,然后尝试 make -p,它显示了该软件已知的许多内置规则。注意makemany functions

如果您使用ninja,请阅读它的documentation,您可能想要生成它正在使用的build.ninja 脚本。您可以使用 Python 脚本或 Guile 脚本(或您自己的 C++ 程序等)生成它。

请注意,g++ 当然会调用一些 GNU binutils 实用程序(例如,汇编器 as 或链接器 ld)。

实际上,将g++ 调用为g++ -Wall -Wextra -g 以获取警告和调试信息(当然还有额外的-I include-directory 标志)。然后使用gdb debugger。一旦你的程序几乎没有错误,添加优化标志,例如-O2

另请参阅 Clangstatic analyzerFrama-CCompCert,以及在 2020 年底,Bismon

考虑在某些情况下生成一些 #include-d C++ 代码(例如,使用 SWIGANTLRQt 或您自己的脚本)或使用您的 plugins 扩展 GCC。

当然要注意Joel Test

【讨论】:

  • 谢谢!我当然会花更多时间阅读文档。我还是太缺乏经验,打错字还以为跟编译器本身有关系。
  • 根据经验,相信编译器胜过自己。 GCC 项目有非常强大的代码审查实践。
  • 链接很多。但是您的回答对我来说并没有多大意义,因为您的回答不是独立的。看起来你基本上只是在说 GTFO&RTFM。
  • @Peilonrayz 确实如此。我是阅读文档的忠实拥护者;我坚信人们应该花更多的时间阅读它。编写任何类型的文档都需要付出很多努力。
  • @BasileStarynkevitch 我阅读并编写了足够多的文档来理解这一点。然而,文档的存在并不能证明写不连贯的废话是合理的。
猜你喜欢
  • 2012-09-30
  • 1970-01-01
  • 2011-03-10
  • 2012-06-13
  • 1970-01-01
  • 2014-02-28
  • 2021-11-30
  • 2012-09-08
  • 1970-01-01
相关资源
最近更新 更多