【问题标题】:Cross compilation of libraries that dynamically or statically linked with system libraries与系统库动态或静态链接的库的交叉编译
【发布时间】:2018-10-03 09:54:53
【问题描述】:

我正在尝试为 RaspberryPi 目标系统交叉编译一些依赖库,主机系统是带有 GCC 编译器的 Linux。例如,假设其中一个库依赖于链接阶段并与系统的静态或动态库之一链接。 链接器如何解决这种情况? (因为那些 .a.so 文件在目标系统上可能不同,因此 RaspberryPi 上的程序可能会在这种情况下崩溃)。如何让它以正确的方式工作?

【问题讨论】:

    标签: gcc raspberry-pi g++ cross-compiling ld


    【解决方案1】:

    交叉编译器提供的构建环境更准确地描述为交叉工具链。它需要提供您需要的一切:不仅是编译器,还包括汇编器、链接器和所有运行时支持库。这包括一个 C 库(可能是 glibc,也可能是其他东西)、GCC 运行时库(libgcc 和 libgcc_s)和 C++ 运行时库(libstdc++)。但是构建环境还需要您的软件需要构建的所有库的副本,通常包括头文件和静态库或目标的动态共享对象。特别是,您不能在主机上使用已安装的头文件,因为它们可能对目标有错误的定义和声明。

    一些程序员只是将他们的依赖项(不是系统库)复制到他们的源代码树中,这样交叉构建环境就可以保持最小。但随后这些库必须作为项目的一部分进行跟踪和更新,这可能很麻烦。

    【讨论】:

    • 我的项目依赖项是 OpenCV 3.4.3,它是从源代码构建的(因此它可能与系统中的某些东西有一些内部链接)和 raspicam。所以在这种情况下,我需要找到 OpenCV 依赖于构建时间的所有库,并从 arm 的源代码构建它们? o_O
    • 是的。您或许可以使用包含所有必需包的预先存在的交叉工具链,但我不知道自从 Emdebian 停止后,大型包集的任何剩余工作。或者您可以简单地在本地构建,可能使用仿真,并使用标准的 GNU/Linux 发行版。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多