旧发行版上的二进制兼容性(使用C++11)

Binary compatibility (using C++11) on older distro versions

本文关键字:兼容性 使用 C++11 二进制      更新时间:2023-10-16

我正在使用GCC在Ubuntu 13上编译一个C++应用程序。我希望能够在我的代码中使用C++11功能,但同时仍然能够生成一个二进制文件,我的用户可以在旧版本的Ubuntu上运行。

如果我使用最新版本的GCC在Ubuntu 13上编译,我的二进制文件将不会在Ubuntu 12上运行,因为glibc不向前兼容:(不同版本的glibc的兼容性如何?)

  • 我有什么选择?

  • 这是否可能在不需要我的用户跳过重重关卡的情况下实现?

  • 如果没有,我的用户必须做什么才能运行二进制文件(即,他们可以在旧版本的Ubuntu上安装更新的glibc吗)?

注意:我不想考虑静态链接glibc,因为:

  1. 我读到这是一个非常糟糕的主意
  2. 许可证问题
  3. 跨分发兼容性问题

目前,我的应用程序不使用任何C++11功能,我使用旧版本的GCC在旧版本的Ubuntu上编译以避免这个问题。但不能使用最新和最棒的语言功能让我很难过:(

您可以尝试使用Boost Libraries,它们与C++11具有完全相同的功能,并且比C++11"更具复古兼容性":它可以在旧版本的Ubuntu上轻松编译。

否则,最好的选择可能是要求Ubuntu 12.04的用户将GCC从4.6升级到4.7或更新版本:http://www.swiftsoftwaregroup.com/upgrade-gcc-4-7-ubuntu-12-04/

您在问"如何使用旧系统上没有的代码"。

答案当然是,"将代码包含在您的项目中"。

如果你仔细思考你的问题,你会意识到在任何情况下,你都需要libstdc++中的c++11函数的代码。因此,如果它们不在ubuntu 12上,你必须添加它们。因此,您必须将其静态链接。这是确保它在任意ubuntu12系统上运行的唯一方法。

好吧,你可以进行一个花哨的安装,但最终,它只是你的应用程序"动态链接"到libstdc++,所以它也可以静态链接,因为没有其他程序会在ubuntu12

上寻找它

通常,只有使用相同的编译器并且(!)编译器的版本匹配(不过你可能很幸运),c++库才是兼容的。在这个意义上,除了编写C代码之外,没有任何方法可以移植。