2014-12-01 31 views
16

作为Linux发行版中的下游维护者,我通常维护的一些软件包开始在其代码库中使用C++ 11功能。它们都依赖于Linux发行版打包的不同库。在当前的Linux发行版上打包C++ 11软件是否安全?

Problems with the ABI将C++ 11代码与C++ 98和AFAIK混合时,当编译软件生成软件包时,大多数当前的主要Linux发行版默认不启用C++ 11标志。

问题是:主要的Linux发行版如何处理C++ 11代码的入口?使用系统库时,是否有体面的方式来检查或避免ABI的这些问题?

谢谢。

+8

你能否提供一个关于“大多数当前主要的Linux发行版都没有启用C++ 11标志”的参考? – DRC 2014-12-01 18:36:01

+1

你在混合g ++版本吗?如果不是这样,我相信这个问题已经在GCC 4.8中修复了 – Mgetz 2014-12-01 19:25:38

+0

@Mgetz 4.8.1至少还有一个提到的问题,4.8.2提到了几个非常小的问题。 – Yakk 2014-12-01 19:54:37

回答

2

该问题与C++ 11与C++ 98无关,只是C++ 11可以激发二进制更改。由C++ 11驱动的二进制变化没有什么特别之处。它们就像普通的二进制变化一样破坏或不破坏。此外,只有当图书馆维护者专门选择更改他的二进制界面时才会更改它们。

换句话说,除非库明确选择为不同的标准版本提供两个不同的二进制接口(这仍然是一个库选择),否则这与标准版本以及与该库有关的所有事情无关。除了这种情况之外,您在C++ 98中与在C++ 11中一样破碎。 Itanium在C++ 11支持版本和C++ 98支持版本之间向后兼容,因此编译器ABI不会中断。

从内存中,除非你使用4.7.0版本,它们为了获得乐趣而不会破坏,那么使用libstdC++就会非常安全 - 它们可以在将来的版本中存储ABI破解, 。换句话说,尽管C++ 11的过渡期可能会引入额外的动机来打破ABI并因此带来额外的风险,但实际上使用C++ 11本身并不会带来任何额外的风险。

相关问题