【问题标题】:Setting up a cross-compilation environment for a specific target platform为特定目标平台设置交叉编译环境
【发布时间】:2011-01-21 03:50:33
【问题描述】:

我想在 Ubuntu 9.10 机器上设置一个交叉编译环境。从我目前阅读的文档(theseonesfor example)来看,这涉及到编译目标平台的工具链。

我的问题是:您如何确定特定目标平台的工具链中每个包的所需版本?有什么我可以遵循的经验法则吗?

这是在上面链接的网站之一中找到的列表:

binutils-2.16.1.tar.bz2
linux-2.6.20.1.tar.bz2
glibc-2.5.tar.bz2
glibc-linuxthreads-2.5.tar.bz2
gcc-core-4.2.0.tar.bz2
gcc-g++-4.2.0.tar.bz2

但假设我想为标准 Ubuntu 8.04 和 CentOS 5.3 机器生成可执行文件。需要哪些包?

我的主要需要是避免客户机器中出现“/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found”之类的错误,但将来我也想处理不同的架构.

【问题讨论】:

    标签: linux gcc cross-compiling


    【解决方案1】:

    我的问题是:你如何确定 每个所需的版本 工具链中的软件包 具体目标平台? ... binutils-2.16.1.tar.bz2 gcc-core-4.2.0.tar.bz2 gcc-g++-4.2.0.tar.bz2

    通常选择最新的稳定版:这些只会影响您的本地工具链,而不影响运行时。

    linux-2.6.20.1.tar.bz2

    你不需要这个。 (对于针对嵌入式平台,您可以使用它。)

    glibc-2.5.tar.bz2 glibc-linuxthreads-2.5.tar.bz2

    你不需要这些。 IE。您不应该下载或构建它们;您应该链接到您想要支持的最旧发行版的版本。

    有没有 我可以遵循的经验法则? 但是假设我想生成 标准 Ubuntu 8.04 的可执行文件 和 CentOS 5.3 盒子。什么是 必要的包?

    您调查了您想要定位的发行版,找到最低公分母版本 libc、libstdc++、pthreads 和您将链接的任何其他共享库,然后将这些库和相应的头文件从具有这些 LCD 版本的框中复制到您的工具链。 [编辑] 我应该澄清一下,你真的想从一个系统中获取所有依赖库。从不同发行版中挑选和选择每个文件版本的 LCD 是快速进入依赖地狱之旅的秘诀。

    【讨论】:

    • 虽然在理论上是个好主意,但链接到最低公分母库版本可能并不总是有效。有时,在旧库版本中公开的符号在以后的版本中变为私有(即__libc_stack_end)。
    • 我多年的经验表明这在实践中也是一个好主意。像 __libc_stack_end 这样的孤立 PPC 问题是对结果进行健全性检查的原因,而不是您的流程的基础。
    • 虽然这是一个孤立的问题,但不仅仅是 PPC。该符号不再被导出,任何使用它的人都必须调整他们的代码。我同意流程不一定由异常情况决定,但您应该意识到异常的可能性。
    【解决方案2】:

    构建一个使用与目标系统上相同版本的libc(和其他库)的跨工具链通常是个好主意。这对于使用版本化符号的库尤其重要,否则您可能会遇到诸如“/usr/lib/libstdc++.so.6: version 'GLIBCXX_3.4.11' not found”之类的错误。

    相同的架构

    要为标准 Ubuntu 8.04 和 CentOS 5.3 系统生成可执行文件,您可以在虚拟机中安装发行版,并在虚拟机中进行必要的编译,以确保生成的二进制文件与每个发行版的库版本兼容。

    另一种选择是为目标发行版设置 chroot 构建环境而不是虚拟机。

    您还可以构建针对不同环境(不同库版本)的工具链,并在您的 Ubuntu 9.10 环境下构建,而无需使用虚拟机或 chroot 环境。我使用 Dan Kegel 的 crosstool 来创建这样的跨工具链。

    不同的架构

    正如我在我的answer 中提到的另一个交叉编译器问题,我使用 Dan Kegel 的 crosstool 来创建我的 arm 交叉工具链。

    它看起来可能有点过时了,但有一个矩阵 build results 用于各种架构,以帮助确定 gcc、glibc、binutils 和 linux 内核头文件的合适组合。

    所需的软件包版本

    根据我的经验,确实没有经验法则。并非所有 gcc、binutils、glibc 和 linux 头文件的组合都能成功构建。即使构建完成,也需要一定程度的测试来验证构建是否成功。这有时是通过使用新的跨工具链编译 Linux 内核来完成的。根据目标系统和架构,可能需要对源代码进行一些修补才能成功构建。


    由于您在 Ubuntu 9.10 上设置此交叉编译环境,您可能需要查看 dpkg-cross 包。

    【讨论】:

      【解决方案3】:

      根据您的目标平台,您是否考虑过使用Optware

      我目前正在使用交叉编译工具链为我的 Palm Pre 构建 Mono 和 Moonlight(Optware makefile 已经处理了大部分依赖项)。

      【讨论】:

        【解决方案4】:

        为其他 Linux 发行版进行编译是最简单的,方法是将它们安装在虚拟机中 (apt-get install kvm),然后从内部进行编译。您还可以编写脚本以自动执行此操作。像其他 Linux 发行版那样构建交叉编译器并提供所有库的完全相同版本等几乎是不可能的。

        【讨论】:

        • 为目标发行版构建 chroot 是另一种计划,重量更轻,但根据所涉及的发行版可能不那么简单。 debootstrap 实用程序将极大地帮助 Debian/Ubuntu 世界。
        猜你喜欢
        • 2019-07-22
        • 1970-01-01
        • 2020-02-04
        • 1970-01-01
        • 2019-09-27
        • 2011-08-24
        • 2016-09-22
        • 1970-01-01
        • 2020-02-05
        相关资源
        最近更新 更多