2013-11-21 46 views
0

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

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

  • 我有哪些选择?

  • 这甚至可能没有要求我的用户跳过大规模的箍?

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

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

  1. 我读过,这是一个非常糟糕的主意
  2. 许可问题
  3. 交叉分布兼容性问题

目前我的应用程序没有使用任何C++ 11功能,并且我在较早版本的Ubuntu wi上编译一个旧版本的GCC来避免这个问题。但它使我伤心不能够使用最新和最伟大的语言特点:(

+0

链接静态。许可问题将以任何方式存在,而且是静态编译的程序 - 因为它包含了所需的所有内容,而不是依赖最终用户的库 - 可以在基本上使用相同CPU的任何Linux系统上运行。 – cHao

+0

只需在较旧的操作系统上使用较新的gcc编译即可。从源代码或手动添加的存储库安装gcc。您可能需要静态链接libstdC++,或者使用您的程序分发libstdC++的副本(我认为这是合法的,如果您还发布libstdC++源代码; IANAL,请咨询您的法律部门)。 –

+1

@cHao,我读过很多关于静态链接glibc的SO问题,许多人似乎表明这是一个坏主意。例如(http://stackoverflow.com/a/11654451/966782)​​。另外,关于静态链接的LGPL让我感到恐慌。我想避免它... – pqvst

回答

0

你问“我如何使用代码是不是在旧系统”。

答案是当然的, “包含你的项目的代码”

如果你想通过你所问的问题,你会发现在任何情况下,你都需要libstdC++中的C++ 11函数的代码。他们不在Ubuntu 12上,你必须添加它们,因此,你必须有静态链接,这是确保它可以在任意ubuntu12系统上运行的唯一方法。那么你可以做一个奇特的安装,但最终,它只是你的应用程序“动态链接”到libstdC++,所以它可能是静态链接,因为没有其他程序将在它寻找它ubuntu12

0

通常,只有使用相同的编译器和(!)编译器的版本匹配时,才能兼容C++库(但您可能很幸运)。除了编写C代码之外,没有办法在这个意义上进行移植。

1

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

否则最好的选择可能是问到Ubuntu 12.04的用户有升级GCC 4.6至4.7或更近: http://www.swiftsoftwaregroup.com/upgrade-gcc-4-7-ubuntu-12-04/