参考 cross-compile 中的架构特定 headers

Referring to architecture specific headers in cross-compile

这个问题与 cross-compiling 没有具体关系,但由于我在尝试 cross-compile 库时遇到与架构特定 header 相关的问题而出现。

我正在尝试 cross-compile OpenCV,目标是 ARM 处理器,我正在 x86_64 处理器上编译。构建失败,因为找不到 header 文件:

/usr/include/zlib.h:34:19: fatal error: zconf.h: No such file or directory #include "zconf.h"

果然在zlib.h中有对zconf.h的引用:

#include "zconf.h"

然而,当我在 <path_to_arm_filesys>/usr/include 下查找时,我实际上在 <path_to_arm_filesys>/usr/include/arm-linux-gnueabihf 目录下找到了 zconf.h。因此,据我了解,C 预处理器不会找到 zconf.h 作为对它的引用 包括对 architecture-specific sub-directory 的引用。

为了尝试了解 zconf.h 的实际找到方式,我参考了主机以及 zconf.h 所在的位置。同样,它位于 /usr/include 但在 architecture-specific x86_64-linux-gnu 目录下。

因此,如果在源代码中没有对体系结构的具体引用(如预期的那样),#include (GNU) C pre-processor 怎么知道去哪里找? pre-processor 是否已经知道它的 architecture-target 并且可以自动将另一个体系结构特定目录附加到它知道的所有包含目录?或者我必须使用这些特定目录的 -I 标志来特别通知它吗?

有 3 种方式可以说明编译器在哪里可以找到 headers :

  • 设置 --sysroot 选项 #preferred for cross-compilation

-sysroot=dir Use dir as the logical root directory for headers and libraries. For example, if the compiler normally searches for headers in /usr/include and libraries in /usr/lib, it instead searches dir/usr/include and dir/usr/lib.

在这种情况下,您必须将所有库和 headers 放在 sysroot 文件夹下。

  • 直接用 -I 选项说出在哪里可以找到 headers。

  • 设置C_INCLUDE_PATH/CPLUS_INCLUDE_PATH环境变量

For #include preprocessor will seachy in search system directories and directories that were provided by compiler.

For #include "filename" preprocessor will search in the same folder where you have file that have this include.

https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html https://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html