旧发行版上的二进制兼容性(使用C++11)
Binary compatibility (using C++11) on older distro versions
我正在使用GCC在Ubuntu 13上编译一个C++应用程序。我希望能够在我的代码中使用C++11功能,但同时仍然能够生成一个二进制文件,我的用户可以在旧版本的Ubuntu上运行。
如果我使用最新版本的GCC在Ubuntu 13上编译,我的二进制文件将不会在Ubuntu 12上运行,因为glibc不向前兼容:(不同版本的glibc的兼容性如何?)
-
我有什么选择?
-
这是否可能在不需要我的用户跳过重重关卡的情况下实现?
-
如果没有,我的用户必须做什么才能运行二进制文件(即,他们可以在旧版本的Ubuntu上安装更新的glibc吗)?
注意:我不想考虑静态链接glibc,因为:
- 我读到这是一个非常糟糕的主意
- 许可证问题
- 跨分发兼容性问题
目前,我的应用程序不使用任何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代码之外,没有任何方法可以移植。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 在Qt中使用C++Lambda函数作为插槽是否有助于保持库的二进制兼容性?
- 将 OpenGL 兼容性配置文件与英特尔 HD GPU + Mesa 结合使用
- 在使用__file__,__line__时,是否存在任何兼容性问题
- 使用/GL时,向后兼容性中断
- 使用按引用传递而不是按指针传递时的二进制兼容性
- 旧发行版上的二进制兼容性(使用C++11)
- 当显式动态链接dll时,使用std::unique_lock会破坏XP的兼容性
- 使用控制台的可视C++:while 循环的字符/字符串兼容性问题
- 未使用的私有虚拟方法是否允许在不破坏ABI兼容性的情况下进行未来扩展
- 如何检测库是否使用XP兼容性(v120_xp)
- 如何检查编译库时使用的CUDA计算兼容性
- Solaris: libSTLPort的二进制兼容性.使用libstd.so
- 在Windows XP, Vista, 7和8中使用旧操作系统的兼容性功能的效果如何?
- 使用-std=c++11会破坏二进制兼容性吗?