旧发行版上的二进制兼容性(使用 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)的主要内容,如果未能解决你的问题,请参考以下文章