新版本的 g++ 与旧版本的 libstdc++

New version of g++ with an older version of libstdc++

我是运行 Linux CentOS 7.3 自带g++ 4.8.5。我想使用 g++ 7.1.0 来编译一些 C++ 软件。但是用 g++ 7.1.0 编译的 C++ 程序正在使用 g++ 7.1.0 和 libstdc++.so 附带的标准库中的头文件,这让事情变得非常痛苦。

有没有办法在使用 g++ 7.1.0 的同时仍然使用与 CentOS 一起安装的 g++ 4.8.5 中的标准库(头文件和 libstdc++.so)?

Is there a way to use g++ 7.1.0 and still use the standard library (both headers and libstdc++.so) from g++ 4.8.5 installed with CentOS?

不要那样做(libstdc++ 来自 GCC 4.8 和 GCC 7 的 ABI 可能不同)。相反,请考虑静态链接 C++ 标准库(来自 GCC 7.1)(以及其他动态库,特别是 C 中的库,包括 libc.so,而不是 C++)。

顺便说一句,你是怎么得到 g++-7.1 的?你可以考虑在你的 CentOS 7 上编译 GCC 7(从它的源代码)(或者得到它的一些打包版本),那么你将拥有正确的 libstdc++

阅读更多关于共享库的信息,例如阅读 Drepper 的论文 How To Write Shared Libraries 并了解有关传递给 ld-rpath 选项的更多信息(通常使用 -Wl,-rpathg++)。

gcc4 和 gcc5 之间的 libstdc++ ABI changed,因此它不会起作用。如果您使用的是 gcc7,则应安装 libstdc++ 7。您可以同时安装两个版本

Developer Toolset 专为这种情况而设计,但目前为 GCC 版本 6:

它的 C++ 编译器的配置方式使其编译的程序动态链接到系统 libstdc++,使用向后兼容的 ABI,并且只有新的 C++ 功能的库代码还没有系统库支持的是静态链接的。这提供了最大的兼容性,并允许编译的应用程序 运行 没有 DTS。