我需要在我的 Centos 6 版本上安装 GLIBCXX 3.4.15(以在 Steam 上运行游戏的服务器)。我用谷歌搜索了一下,找到了几个网站,他们在安装程序时出现错误,提示需要 3.4.15 ( LoadLibrary ERROR: /usr/lib/libstdc++.so.6: version 'GLIBCXX_3.4.15' not found
),但他们只是使用了一种方法来绕过它/不安装它。当我这样做时strings /usr/lib/libstdc++.so.6 | grep GLIBCXX
,这是输出:
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
那么,如何在 Centos 6 上直接安装 GLIBCXX 3.4.15 呢?
答案1
我认为这是一种 hack,但使用它的次数比我愿意承认的更多,以解决与 GLIBC 的兼容性问题,例如您遇到的问题。
该黑客攻击涉及创建一个链接,/usr/lib
其中包含特定工具所需的库的名称。然后该链接指向该库的替代名称。
例子
假设我想创建一个链接到libstdc++.so.6
.
$ ls -l /usr/lib | grep libstdc++.so
lrwxrwxrwx. 1 root root 19 Dec 18 2010 libstdc++.so.6 -> libstdc++.so.6.0.14
-rwxr-xr-x 1 root root 950428 Sep 24 2010 libstdc++.so.6.0.14
它的结果是这样的:
$ ln -s libstdc++.so.6 libstdc++.so.6.0.15
检查结果:
$ ls -l /usr/lib | grep libstdc++.so
lrwxrwxrwx. 1 root root 19 Dec 18 2010 libstdc++.so.6 -> libstdc++.so.6.0.14
lrwxrwxrwx. 1 root root 19 Dec 18 2010 libstdc++.so.6.0.15 -> libstdc++.so.6.0.14
-rwxr-xr-x 1 root root 950428 Sep 24 2010 libstdc++.so.6.0.14
但我不确定这个方法是否有效,因为您的库仍然会缺少版本字符串GLIBCXX_3.4.15
.
如果破解不成功,那么您可能必须硬着头皮将 GLIBC 安装在另一个目录中,然后覆盖LD_LIBRARY_PATH
或LD_PRELOAD
以便仅执行 steam 才能看到修改后的库。
例子
$ LD_PRELOAD='mylibc.so anotherlib.so' program
有关如何执行此操作的详细信息,请参阅此 SO Q&A:单个主机上的多个 glibc 库。
答案2
基本上,CentOS (4.4.7) 附带的 libstdc++ RPM 软件包的版本对于您的应用程序来说不够新。 CentOS 提供长期稳定性,而不是最新和最好的版本,因此这并不完全出乎意料。
Fedora 通常领先很多,并且可以毫无问题地运行您的服务器。
或者,您可以从更新的源构建更新版本的 libstdc++。我会从 gcc SRPM(来自 gcc.gnu.org 的最新版本)中的 CentOS SPEC 文件开始,并重新编写这些文件来构建我自己的 RPM。
在过去,C 库的升级是以意想不到的方式破坏系统的好方法......
答案3
我对 Nodejs v6.9.2 的 grpc 模块(由 google-cloud 导入)也有同样的问题。这个解决方案对我有用:(来自https://forum.qt.io/topic/25032/solved-centos-6-3-glibcxx_3-4-15-not-found-error-in-qt5-install/8)
tar xzf gcc-4.6.2.tar.gz
cd gcc-4.6.2
./contrib/download_prerequisites
cd ..
mkdir objdir
cd objdir
$PWD/../gcc-4.6.2/configure --prefix=/opt/gcc-4.6.2
make
make install