GCC 编译器在查找头文件时不搜索子目录
GCC compiler does not search sub-directories when looking for header files
我无法让 gcc 编译器识别 "includes" 中的复杂路径。
这是我的玩具 "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 妥善处理 include 中的子目录?我在这里缺少标志或某些选项吗?
How do I force gcc to treat sub-directories well in the includes? Is there a flag or some option that I'm missing here?
阅读 GCC, in particular the Invoking GCC chapter, the section on preprocessor options (e.g. -I
include-dir or -H
or -M
, etc...), the documentation of the preprocessor 的文档。也试试 g++ --help
; -I
include-directory 标志可以重复很多次,可能正是您所需要的。当然,g++
程序的参数顺序很重要。在编译或链接 C++ 程序时,您可能希望使用 g++
而不是 gcc
。
另请阅读some documentation of C++ (maybe even the n3337 "draft" standard). Be aware of translation units, and of the role of the linker。
在实践中,您希望使用一些 build automation tool, such as GNU make or ninja 或许多其他驱动 GCC 编译。
如果您使用 GNU make
,请阅读 make
的 documentation then try make -p
which shows the many built-in rules known to that software. Be aware of the many functions。
如果您使用 ninja
,请阅读它的 documentation, you probably want to generate the build.ninja
script it is using. You could generate it using a Python script or a Guile 一个(或您自己的 C++ 程序等...)。
请注意,g++
当然会调用一些 GNU binutils 实用程序(例如汇编程序 as
或链接程序 ld
)。
实际上,调用 g++
作为 g++ -Wall -Wextra -g
来获取警告和调试信息(当然还有额外的 -I
include-directory 标志).然后使用gdb
debugger。一旦您的程序几乎没有错误,请添加优化标志,例如 -O2
另见 Clang, its static analyzer, Frama-C, and CompCert and, at end of 2020, Bismon。
考虑在某些情况下生成一些 #include
-d C++ 代码(例如 SWIG or ANTLR or Qt or your own script) or to extend GCC with your plugins.
当然要注意 Joel Test。
我无法让 gcc 编译器识别 "includes" 中的复杂路径。
这是我的玩具 "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 妥善处理 include 中的子目录?我在这里缺少标志或某些选项吗?
How do I force gcc to treat sub-directories well in the includes? Is there a flag or some option that I'm missing here?
阅读 GCC, in particular the Invoking GCC chapter, the section on preprocessor options (e.g. -I
include-dir or -H
or -M
, etc...), the documentation of the preprocessor 的文档。也试试 g++ --help
; -I
include-directory 标志可以重复很多次,可能正是您所需要的。当然,g++
程序的参数顺序很重要。在编译或链接 C++ 程序时,您可能希望使用 g++
而不是 gcc
。
另请阅读some documentation of C++ (maybe even the n3337 "draft" standard). Be aware of translation units, and of the role of the linker。
在实践中,您希望使用一些 build automation tool, such as GNU make or ninja 或许多其他驱动 GCC 编译。
如果您使用 GNU make
,请阅读 make
的 documentation then try make -p
which shows the many built-in rules known to that software. Be aware of the many functions。
如果您使用 ninja
,请阅读它的 documentation, you probably want to generate the build.ninja
script it is using. You could generate it using a Python script or a Guile 一个(或您自己的 C++ 程序等...)。
请注意,g++
当然会调用一些 GNU binutils 实用程序(例如汇编程序 as
或链接程序 ld
)。
实际上,调用 g++
作为 g++ -Wall -Wextra -g
来获取警告和调试信息(当然还有额外的 -I
include-directory 标志).然后使用gdb
debugger。一旦您的程序几乎没有错误,请添加优化标志,例如 -O2
另见 Clang, its static analyzer, Frama-C, and CompCert and, at end of 2020, Bismon。
考虑在某些情况下生成一些 #include
-d C++ 代码(例如 SWIG or ANTLR or Qt or your own script) or to extend GCC with your plugins.
当然要注意 Joel Test。