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

Posted

技术标签:

【中文标题】旧发行版上的二进制兼容性(使用 C++11)【英文标题】:Binary compatibility (using C++11) on older distro versions 【发布时间】:2013-11-21 20:31:25 【问题描述】:

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

如果我在 Ubuntu 13 上使用最新版本的 GCC 进行编译,我的二进制文件将无法在 Ubuntu 12 上运行,因为 glibc 不向前兼容: (How compatible are different versions of glibc?)

我有哪些选择?

这甚至可能不需要我的用户跳过大量的障碍吗?

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

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

    我听说这是一个非常糟糕的主意 许可问题 跨发行版兼容性问题

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

【问题讨论】:

静态链接。无论哪种方式,许可问题都会存在,静态编译的程序——因为它包含它需要的一切,而不是依赖于最终用户的库——基本上可以在任何使用相同 CPU 的 Linux 系统上运行。 只需在较旧的操作系统上使用较新的 gcc 进行编译。从源代码或手动添加的存储库安装 gcc。不过,您可能必须静态链接 libstdc++,或者在您的程序中分发 libstdc++ 的副本(我认为这是合法的,如果您还提供 libstdc++ 源;IANAL,请咨询您的法律部门)。 @cHao,我已经阅读了很多关于静态链接 glibc 的 SO 问题,并且许多似乎表明这是一个坏主意。例如 (***.com/a/11654451/966782)。此外,关于静态链接的 LGPL 让我感到害怕。我想避免它... 【参考方案1】:

您可以尝试使用 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/

【讨论】:

【参考方案2】:

您在问“我如何使用不在旧系统上的代码”。

答案当然是“在您的项目中包含代码”。

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

好吧,您可以进行精美的安装,但最终,它只是您的应用程序“动态链接”到 libstdc++,所以它也可以是静态链接的,因为没有其他程序会寻找它在 ubuntu12 上

【讨论】:

【参考方案3】:

一般来说,只有使用相同的编译器并且(!)编译器的版本匹配时,c++ 库才兼容(不过你可能很幸运)。从这个意义上说,除了编写 C 代码外,没有办法可移植。

【讨论】:

以上是关于旧发行版上的二进制兼容性(使用 C++11)的主要内容,如果未能解决你的问题,请参考以下文章

Linux的文件系统

Linux 发行版上的 windeployqt.exe

在 Linux 上部署 Qt 应用程序二进制文件,与 LSB 兼容

Visual Studio C++ 可再发行兼容性

git的基本使用-1

Laravel建站01--开发环境部署