【发布时间】:2016-12-19 14:39:31
【问题描述】:
我在 C++ 上构建了一个 exec,但是当我将它部署到部署机器时,我发现如下错误:`
/lib64/libc.so.6: version GLIBC_2.14 not found
/usr/lib64/libstdc++.so.6: version GLIBCXX_3.4.14 not found
/usr/lib64/libstdc++.so.6: version CXXABI_1.3.5 not found
这是因为部署机器是基于 rhel 的系统,带有较旧的 libc(2.12)/libstdc++(3.4.13),而我的机器是带有最新内核和库的 ubuntu。不幸的是,我无法升级部署系统。
我尝试了一些常用的方法来处理这个问题,比如静态链接(libc 失败)并将我的库版本复制到集群(并使用 LD_PRELOAD 和 -Wl,--rpath 选项运行),但它不起作用。我还在我的机器上安装了旧版本的 gcc,但这也不起作用。
有什么方法可以让它工作(也许在我的本地机器上制作目标代码,然后在另一台机器上链接它)。或者有没有办法在部署机器上编译代码而不复制源代码。 这可以从部署机器获取系统库的副本并尝试让 gcc 与它们链接吗? (任何问题,以及如何正确地做到这一点)
与Compile with older libc (version `GLIBC_2.14' not found) 和Deploying Yesod to Heroku, can't build statically 相关 和Build and run C++ code on different version of Linux and glibc
我知道通过 VM 执行此操作的一种方法,但如果可能,我想避免它。(HT Mat)
【问题讨论】:
-
解决方法:在您的开发机器上创建一个与您的生产目标具有相同操作系统版本的虚拟机。用它来编译和测试。
-
是的,创建虚拟机是可能的,我想尽可能避免这种情况。在相关说明中,哪个 VM 可能适合在 ubuntu 上部署 rhel。
-
静态链接需要
glibc-static和您需要的其他静态库存档。如果您没有静态库存档,则无法链接静态。 -
除VM外还有其他解决方案,例如设置 chroot。
-
@EmployedRussian 我有点同意这个问题与 yesod/heroku 问题相同。我自己与它联系在一起。但是那里的解决方案似乎都不起作用。我可能错过了一些东西,在这种情况下,我想知道它是什么。静态链接 glibc 仍然会导致问题,甚至在我的代码的任何部分开始之前复制我自己的 glibc 版本和复制我的 glibc 段错误。在部署系统上编译代码是不可行的。所以这让 Vm 像部署一样,我想知道是否可以避免这种情况
标签: c++ gcc shared-libraries cross-compiling glibc