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

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

#include "sub/testlib.h"

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

这是文件夹“main.cpp”中文件“teSTLib.h”的路径,位于:../lib/sub/teSTLib.h。

我在编译时指定了include目录:
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的文档,尤其是Invoking GCC章节,preprocessor options的部分(例如-I include-dir或-H-M等),documentationpreprocessor。也尝试g++ --help; -I包含目录标志可以重复很多次,可能正是您所需要的。当然,g++程序的参数顺序很重要。编译或链接C++程序时,可能要使用g++而不是gcc

另请阅读C++的some documentation(甚至是n3337“草稿”标准)。请注意translation unitslinker的角色。

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

如果使用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
另请参见Clang,其static analyzerFrama-CCompCert,以及在2020年末Bismon

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

当然要注意Joel Test

关于c++ - GCC编译器在查找头文件时不搜索子目录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61384481/

10-11 22:13
查看更多