[英]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 make或ninja或许多其他工具)来驱动 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
另请参阅Clang 、 static 分析仪、 Frama-C和CompCert ,以及 2020 年底的Bismon 。
考虑在某些情况下生成一些#include
-d C++ 代码(例如,使用SWIG或ANTLR或Qt或您自己的脚本)或使用您的插件扩展 GCC。
当然要注意Joel 测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.