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

时间:2010-02-25 18:56:43

标签: 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-Linux线程-2.5.tar.bz2
GCC-核心4.2.0.tar.bz2
GCC-克++ - 4.2.0.tar.bz2

但是假设我想为标准的Ubuntu 8.04和CentOS 5.3盒子生成可执行文件。什么是必要的包裹?

我的主要需求是避免在客户的机器中出现“/usr/lib/libstdc++.so.6:版本`GLIBCXX_3.4.11未找到”之类的错误,但将来我想要处理不同的架构

4 个答案:

答案 0 :(得分:4)

构建使用目标系统上相同版本的 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标头的组合都能成功构建。即使构建完成,也需要进行一定程度的测试以验证构建的成功。这有时通过使用新的交叉工具链编译Linux内核来完成。根据目标系统和体系结构,可能需要对源进行一些修补才能生成成功的构建。


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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

  

我的问题是:你如何确定   每个所需的版本   工具链中的包用于   具体目标平台?   ...   的binutils-2.16.1.tar.bz2   GCC-核心4.2.0.tar.bz2   GCC-克++ - 4.2.0.tar.bz2

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

  

Linux的2.6.20.1.tar.bz2

你不需要这个。 (对于可能使用它的目标嵌入式平台。)

  

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

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

  

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

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

答案 3 :(得分:0)

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

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