【问题标题】:New version of g++ with an older version of libstdc++新版本的 g++ 和旧版本的 libstdc++
【发布时间】:2017-06-22 11:39:33
【问题描述】:

我正在运行 g++ 4.8.5 附带的 Linux CentOS 7.3。我想用 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)?

【问题讨论】:

  • 您是否尝试过使用-std=c++03/-std=gnu++03-Wl,-rpath 指向原始库?
  • 痛苦到底是什么?您将 -Wl,-rpath=/path/to/your/new/libstdc++.so/directory 添加到您的 g++ 标志中,就完成了。
  • @n.m.假设您想编译带有自己的构建系统(例如 Bazel)的 TensorFlow,并且您不想花太多时间来破解这样的东西。 :-(
  • 任何有价值的构建系统都应该尊重 CFLAGS、CXXFLAGS 和 LDFLAGS 环境变量。不过你可能想看看this
  • @n.m.谢谢,我试试看。

标签: c++ linux libstdc++


【解决方案1】:

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

不要这样做(来自 GCC 4.8 和 GCC 7 的 libstdc++ 的 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++)。

【讨论】:

  • 如果我没记错的话,ABI 主要取决于您使用的 C++ 标准的版本。例如,如果您使用 -std=c++03,您将能够在可用的 libstdc++ 较旧的系统中运行您的二进制文件。否则,您将完全破坏向后兼容性。通常,标头具有适当的预处理器条件块,要么使用新的实现,要么使用旧的实现。请记住,GCC 5 使用 C++03,GCC 6 使用 C++11,GCC 7 默认使用 C++17。
  • @Jorge:无论如何,他们破坏了诸如 std::string 从 gcc 4.x 到 gcc 5.x 的实现。所以我不确定这只是 C++ 版本的问题。但老实说,我不知道 std::string 是否在 libstdc++ 中某些函数的签名中
  • "以及来自 CentOS 的库" 如果这些是 C++ 库,这可能有点问题。您可能必须使用您的程序切换到旧的 C++ ABI。 C 库没问题。
  • @InsideLoop 是的,您可以使用-D_GLIBCXX_USE_CXX11_ABI=0 将 g++>=5(或者更确切地说是它附带的 libstdc++)切换到旧 ABI。您可能需要也可能不需要它。如果您不打算在使用不同版本的 g++ 编译的模块之间传递 std::stringstd::list,那么你可能不需要它。
  • @InsideLoop 具有向后兼容性。使用旧 ABI 的程序可以在具有较新 libstdc++ 的系统上运行,因为它同时支持新 ABI 和旧 ABI。
【解决方案2】:

gcc4 和 gcc5 之间的 libstdc++ ABI changed 所以这不起作用。如果你使用 gcc7,你应该安装 libstdc++ 7。你可以同时安装两个版本

【讨论】:

  • 系统库只能有一个libstdc++.so.6。并行安装需要用LD_LIBRARY_PATH玩游戏。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多