我想在Ubuntu 9.10机器上建立一个交叉编译环境。从我到目前为止阅读的文档(these ones,for 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
但是假设我想为标准的Ubuntu8.04和CentOS 5.3生成可执行文件。必要的包是什么?
我的主要需求是避免像"/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11‘not found“这样的错误出现在客户的机器上,但将来我也想处理不同的架构。
发布于 2010-02-26 04:51:19
通常,构建一个使用与目标系统上相同版本的libc (和其他库)的跨工具链是一个好主意。对于使用版本化符号的库,这一点尤其重要,否则可能会出现类似"/usr/lib/libstdc++.so.6:找不到版本'GLIBCXX_3.4.11‘“的错误。
相同的架构
要为标准的Ubuntu8.04和CentOS 5.3系统生成可执行文件,您可以在虚拟机中安装这些发行版,并在虚拟机中进行必要的编译,以确保生成的二进制文件与每个发行版的库版本兼容。
另一种选择是为目标发行版设置chroot构建环境,而不是虚拟机。
您还可以针对不同的环境(不同的库版本)构建工具链,并在Ubuntu 9.10环境下构建,而无需使用虚拟机或chroot环境。我已经使用Dan Kegel的创建了这样的跨工具链。
不同的架构
正如我在answer中提到的另一个交叉编译器问题,我使用Dan Kegel的创建了我的arm交叉工具链。
它看起来可能有点过时了,但是有一个适用于各种体系结构的build results矩阵,可以帮助确定合适的组合,包括gcc、glibc、binutils和linux内核头文件。
所需的包版本
在我的经验中,真的没有经验法则。并不是所有组合的gcc、binutils、glibc和linux头文件都能成功构建。即使构建完成,也需要进行一定程度的测试来验证构建的成功。这有时是通过使用新的跨工具链编译Linux内核来实现的。根据目标系统和体系结构的不同,可能需要对源代码进行一些修补才能生成成功的构建。
由于您是在Ubuntu9.10上设置这个交叉编译环境,因此您可能需要查看包。
发布于 2010-02-26 02:59:16
对于其他Linux发行版,编译最简单的方法是将它们安装在虚拟机中(apt-get install kvm),然后从内部进行编译。您还可以编写脚本让它们自动执行此操作。像其他Linux发行版一样,构建交叉编译器并提供所有库的完全相同的版本几乎是不可能的。
发布于 2010-03-03 00:26:52
我的问题是:对于特定的目标平台,如何确定工具链中每个包的所需版本?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
你不需要这些。也就是说,您不应该下载或构建它们;您应该链接到您想要支持的最旧发行版的版本。
有什么我可以遵循的经验法则吗?但是假设我想为标准的Ubuntu8.04和CentOS 5.3生成可执行文件。必要的包是什么?
您调查您想要针对的发行版,找到libc、libstdc++、pthread和您将链接的任何其他共享库的最低公分母版本,然后将这些库和相应的头文件从具有这些LCD版本的盒子中复制到您的工具链。编辑我应该澄清一下,你真的想从一个系统中获得所有的依赖库。从不同的发行版中挑选每个文件版本的LCD是快速进入依赖地狱的秘诀。
https://stackoverflow.com/questions/2336750
复制相似问题