我无法让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
等),documentation的preprocessor。也尝试g++ --help
; -I
包含目录标志可以重复很多次,可能正是您所需要的。当然,g++
程序的参数顺序很重要。编译或链接C++程序时,可能要使用g++
而不是gcc
。
另请阅读C++的some documentation(甚至是n3337“草稿”标准)。请注意translation units和linker的角色。
在实践中,您想使用某些build automation工具(例如GNU make或ninja或许多其他工具)来驱动GCC编译。
如果使用GNU的make
,请阅读其documentation,然后尝试make -p
,它显示了该软件已知的许多内置规则。注意make
的many 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 analyzer,Frama-C和CompCert,以及在2020年末Bismon。
在某些情况下,请考虑生成一些#include
-d C++代码(例如,使用SWIG或ANTLR或Qt或您自己的脚本)或使用plugins扩展GCC。
当然要注意Joel Test。
关于c++ - GCC编译器在查找头文件时不搜索子目录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61384481/