【问题标题】:Cross compile on Fedora 18 for Centos 6.4在 Fedora 18 上为 Centos 6.4 交叉编译
【发布时间】:2013-05-14 12:31:34
【问题描述】:

我正在开发一个项目,该项目在 Fedora 18 机器上使用 C++11 标准中的类,并希望将其部署在 Centos 6.4 服务器上。

我能够解决除 libc 和 libc++ 版本之外的所有加载程序错误,它们分别是 GLIBC_2.11、GLIBCXX_3.4.15 和我的 Fedora 机器 GLIBC_2.14 和至少 GLIBCXX_3.4.17。

是否可以告诉编译器编译/链接服务器版本或更旧的兼容版本的库?

当我运行 ldd 可执行文件 我得到 ​​p>

./executable: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./executable)
./executable: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./executable)

提前致谢!

【问题讨论】:

  • This question 已经处理了 libc,将其扩展到 libstdc++ 应该不会太难。
  • 我将所需的共享对象从我的开发者机器复制到了一个 libs 文件夹中,并添加了 -Xlinker -rpath=libs/ -Xlinker -Ilibs/ld.so Makefile 中的 >CXXFLAGSLFLAGS。然后我将此文件夹和可执行文件复制到服务器,我收到有关 Qt 的其他链接器错误。至少有一些进展:-)
  • @syam:谢谢!我能够让程序运行 :-) 只需将所有需要的共享库复制到此 lib 文件夹并将所有内容部署到服务器。

标签: c++ c++11 fedora centos6 cross-compiling


【解决方案1】:

您可以使用mockepel-6-x86_64 配置设置一个包含CentOS 构建环境的chroot,而不是手动将库复制到一个单独的目录。

在模拟 chroot 中使用 yum 安装您想要的软件包(例如 Qt)并在其中构建,这将确保代码仅使用安装在 chroot 中的 CentOS 6 库,而不是其余的软件包在您的 Fedora 操作系统上。

更新:

当我使用模拟 chroot 构建 GCC 时,我会这样做:

# only need these steps once to setup the chroot
mock -r fedora-19-x86_64 --init
mock -r fedora-19-x86_64 --install yum
mock -r fedora-19-x86_64 --shell 'mkdir -p /builddir/gcc/src /builddir/gcc/build'
su -c 'mount --bind $PATH_TO_GCC_SOURCES /var/lib/mock/fedora-19-x86_64/root/builddir/gcc/src'
# enter root password
mock -r fedora-19-x86_64 --shell
# now in chroot
yum install gmp-devel mpfr-devel libmpc-devel flex autogen
su - mockbuild
cd gcc/build
../src/configure --prefix=/builddir/gcc/install ... etc. ...

出于您的目的,您可以将 fedora-19 替换为 epel-6

绑定挂载意味着我不需要 chroot 中的 GCC 源,我可以在我的普通文件系统中使用现有的副本。有关构建 GCC 的信息,请参阅 http://gcc.gnu.org/wiki/InstallingGCC

在 chroot 中安装 GCC 后,您可以使用它来构建自己的程序,然后将它们打包以用于 CentOS。

稍后再回到 chroot:

mock -r fedora-19-x86_64 --shell
su - mockbuild

【讨论】:

  • glibc 中缺少的功能怎么办?由于我们使用 C++11,CentOS 的 glibc 版本可能不支持。
  • 模拟 chroot 将使用与 CentOS 机器相同的 glibc,因此可执行文件无论如何都不会依赖于较新 glibc 中的任何内容。但是,您说“是否可以告诉编译器为服务器版本或旧兼容版本的库进行编译/链接?”但这与想要使用较新的库相矛盾。要么链接到没有 C++11 特性的旧库,要么链接到具有 C++11 特性的较新库,你不能同时拥有!
  • 如果您需要 C++11 功能,那么您需要 CentOS 机器上的较新库,或者您可以在模拟 chroot 中安装较新的 GCC,因此它使用 CentOS glibc,然后您可以使用 -static-libstdcxx 静态链接到较新的 libstdc++。这样,您的可执行文件将不依赖于libstdc++.so,而只会依赖于 CentOS 机器上存在的旧 glibc
  • 我添加了更多信息来帮助您入门
  • 非常感谢您的帮助!我认为我们现在为我们的服务器应用程序提供了一个很好的编译环境。
猜你喜欢
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 2015-10-16
  • 2013-04-06
  • 2011-11-05
相关资源
最近更新 更多