【问题标题】:Referring to architecture specific headers in cross-compile在交叉编译中引用体系结构特定的头文件
【发布时间】:2016-03-30 19:56:51
【问题描述】:

这个问题与交叉编译没有特别的关系,但由于我在尝试交叉编译库时遇到了与体系结构特定的头文件相关的问题而出现。

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

/usr/include/zlib.h:34:19: 致命错误: zconf.h: 否 这样的文件或目录#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,因为对它的引用包括对特定于体系结构的子目录的引用。

为了尝试了解zconf.h 是如何实际找到的,我参考了主机以及zconf.h 所在的位置。同样,它位于/usr/include 下,但在特定于架构的x86_64-linux-gnu 目录下。

因此,如果在任何#include 的源代码中都没有对体系结构的具体引用(正如预期的那样),(GNU)C 预处理器如何知道在哪里查找?预处理器是否已经知道它的体系结构目标并且可以自动将另一个体系结构特定目录附加到它知道的所有包含目录中?还是我必须使用这些特定目录的-I 标志专门通知它?

【问题讨论】:

    标签: gcc c-preprocessor cross-compiling gnu


    【解决方案1】:

    有 3 种方法可以告诉编译器在哪里找到头文件:

    • 设置--sysroot 选项#preferred 用于交叉编译

    -sysroot=dir 使用 dir 作为头文件和库的逻辑根目录。例如,如果编译器通常搜索头文件 在 /usr/include 和 /usr/lib 中的库中,它改为搜索 dir/usr/include 和 dir/usr/lib.

    在这种情况下,您必须拥有 sysroot 文件夹下的所有库和头文件。

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

    • 设置C_INCLUDE_PATH/CPLUS_INCLUDE_PATH环境变量

    对于#include,预处理器会搜索系统目录和编译器提供的目录。

    对于#include "filename" 预处理器将在您拥有包含此包含的文件的同一文件夹中搜索。

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

    【讨论】:

    • 感谢您的回复。我想我对 C 预处理器如何解释 #include 指令感到困惑。例如,我在想 #include "zconf.h" 被 C 预处理器解释为“在 ROOT 包含目录中查找并找到 zconf.h”。但是,如果使用-I 选项,那么我可以有许多“根”包含目录,那么预处理器将哪个目录视为根目录?
    • 我认为因此我必须明确声明要包含的特定于体系结构的目录,而不是假设预处理器可以自动将额外的目录级别(基于编译的体系结构)附加到包含它的目录中通知。
    • 请检查我的回答。顺便说一句:如果您使用的是使用--target=something 选项构建的编译器,编译器可能知道something 文件夹。此外,只需使用 -### 选项并查看 cc 命令行,即可轻松检查编译器使用的文件夹
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多