3

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

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

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

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”之类的错误,但将来我也想处理不同的架构。

4

4 回答 4

4

构建一个使用与目标系统上相同版本的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 的交叉工具来创建这样的交叉工具链。

不同的架构

正如我在回答另一个交叉编译器问题时所指出的,我使用 Dan Kegel 的交叉工具来创建我的 arm 交叉工具链。

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

所需的软件包版本

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


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

于 2010-02-25T20:51:18.617 回答
2

我的问题是:您如何确定特定目标平台的工具链中每个包的所需版本?... 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

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

有什么我可以遵循的经验法则吗?但假设我想为标准的 Ubuntu 8.04 和 CentOS 5.3 机器生成可执行文件。有哪些必要的包?

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

于 2010-03-02T16:26:51.983 回答
2

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

于 2010-02-25T18:59:15.693 回答
0

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

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

于 2010-02-25T18:59:34.290 回答