首页 > 解决方案 > 在没有 gcc8 的生产环境中运行使用 gcc8 构建的程序

问题描述

我的开发/生产环境都是 CentOS-7.7。为了用 gcc-8.3.0 编译我的程序,我在我的开发环境中安装了“devtoolset-8”,但它不能以与 CentOS7 最初附带的 gcc-4.8.5 相同的方式使用。每次需要编译一个程序,都必须使用“scl enable devtoolset-8 -- bash”切换到gcc8而不是gcc4.8.5。

程序部署到生产环境时,没有gcc8,也没有libstdc++.so.6.0.25,所以无法运行。我猜 libstdc++.so.6.0.25 应该与 gcc8 一起发布?我既不能在生产环境上安装“devtoolset-8”,也不能在生产环境上从源代码构建 gcc8。可以从 CentOS 的官方 yum repo 安装的 libstdc++ 版本是 libstdc++.so.6.0.19,因此我的程序无法在生产环境中加载。如何让这样的程序运行?

谢谢!请原谅我丑陋的英语。

标签: gcccentosyumlibstdc++devtoolset

解决方案


为了不必复制或发送单独的libstdc++.so链接,而是静态链接(如评论中所建议的)针对C++运行时,可以将C++程序链接到-static-libstdc++(同时指定-static-libgcc也将确保程序不依赖于足够新的版本系统上的 libgcc_s.so - 尽管这应该很少成为问题)。

也可能存在目标系统版本glibc太旧(相对于构建系统)的问题。在这种情况下,无论如何都可以编译gcc旧系统上的任何最新版本,以便生成的C++可执行文件以及libstdc++与旧的glibc. 链接C++程序-static-libstdc++将再次有助于不依赖于必须能够libstdc++.so在运行时找到的程序。

最后,C++程序也可以链接到-static根本不依赖任何动态库。


推荐阅读