linux - 为特定目标平台设置交叉编译环境

标签 linux gcc cross-compiling

我想在 Ubuntu 9.10 机器上搭建交叉编译环境。从我目前阅读的文档(these onesfor 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”之类的错误,但将来我也想处理不同的架构.

最佳答案

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

相同的架构

要为标准 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 header 的组合都能成功构建。即使构建完成,也需要进行某种级别的测试来验证构建是否成功。这有时是通过使用新的交叉工具链编译 Linux 内核来完成的。根据目标系统和架构,可能需要对源进行一些修补才能生成成功的构建。


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

关于linux - 为特定目标平台设置交叉编译环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2336750/

相关文章:

qt - 如何交叉编译不同平台的Qt应用程序

c++ - 所有 CopyConstructible 类型都是 MoveConstructible 类型吗?

仅在 Windows 中的 C 程序编译器警告 (MinGW-w64)

编译器将 printf 更改为 puts

c++ - 使用 cmake 为 ARM 和 OpenCV 进行交叉编译

mariadb - 如何交叉编译安装了 mariadb10 的 RPI3(Stretch)以与 QTCreator 一起使用?

c++ - 控制台程序偶尔不工作?

linux - 在不相关的可执行文件 linux 中调用函数

linux - 是否可以在 big endian、arm32、linux=2.6.34 上运行 docker?

c - 从linux内核访问物理内存