C ++库兼容性

时间:2011-01-16 14:06:42

标签: c++ gcc compiler-construction binary-compatibility

我目前正在编写一个库,正在考虑从GCC 4.1.2移动到GCC的4.5.2(最新版本)。如果我将我的代码编译成静态库,我可以假设编译器兼容性(显然在相同的操作系统上)对于客户端应该是非问题吗?

修改 为了进一步澄清:如果我向客户端提供一个使用gcc 4.5.2编译的静态链接库,那么就它们必须使用的编译器和版本而言,这对这个库的用户有什么限制?

2 个答案:

答案 0 :(得分:8)

刚刚遇到过这个问题,我相信我会从http://gcc.gnu.org/bugs/#nonbugs回答我的问题:

  

ABI更改C ++应用程序二进制文件   interface(ABI)由两部分组成   组件:第一个定义如何   课程的元素是如何布局的   调用函数,函数如何   名字被破坏等;第二   部分涉及的内部   libstdc ++中的对象。虽然我们   到目前为止,争取不变的ABI   我们不得不用每个修改它   主要发布。如果你改变你的   编译器到不同的主要版本   你必须重新编译所有的库   包含C ++代码。如果你没有这样做   您可能会遇到链接器错误或   故障程序。我们的一些   Java支持库也包含   C ++代码,所以你可能想要   重新编译所有库是安全的。它   不需要重新编译   如果您已更改为错误修复程序   发布相同版本的   编译器; bug修复版本很小心   避免ABI变化。另见   海湾合作委员会的兼容性部分   手册。

     

备注:指定了主要版本   通过改变第一或第二   两部分或三部分的组成部分   版本号。未成年人(错误修复)   发布由更改指定   仅限第三个组成部分。因此GCC 3.2   和3.3是主要版本,而   3.3.1和3.3.2是GCC 3.3的错误修复版本。随着3.4系列我们   正在引入新的命名方案;   这个系列的第一个版本是   3.4.0而不仅仅是3.4。

根据我的理解,我需要确保客户端将我的库与主要版本的兼容版本的gcc链接。

答案 1 :(得分:1)

如果您提供静态库或动态库并不重要,用户仍然需要使用可兼容的编译器/链接器来链接它。通常当GCC进行ABI更改时,它们会提供一个可以设置为使用旧ABI的开关。我知道当他们从3.x到4.x甚至是4.x系列中的几个版本时,他们就这样做了。