繁体   English   中英

GCC 编译器在查找 header 文件时不搜索子目录

[英]GCC compiler does not search sub-directories when looking for header files

我无法让 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 很好地处理包含中的子目录? 我在这里缺少标志或某些选项吗?

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

阅读GCC的文档,特别是Invoking GCC章节, 预处理器选项部分(例如-I include-dir-H-M等),预处理器文档 也试试g++ --help -I包含目录标志可以重复很多次,这可能是您需要的。 当然,arguments 到g++程序的顺序很重要。 在编译或链接 C++ 程序时,您可能希望使用g++而不是gcc

另请阅读 C++ 的一些文档(甚至可能是n3337 “草案”标准)。 注意翻译单元,以及linker的作用。

在实践中,您希望使用一些构建自动化工具(例如GNU makeninja或许多其他工具)来驱动 GCC 编译。

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

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

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

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

另请参阅Clangstatic 分析仪Frama-CCompCert ,以及 2020 年底的Bismon

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

当然要注意Joel 测试

暂无
暂无

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

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