【问题标题】:C++ Library CompatibilityC++ 库兼容性
【发布时间】:2011-06-09 23:57:10
【问题描述】:
我目前正在编写一个库,并且正在考虑从 GCC 4.1.2 迁移到 GCC 的 4.5.2(最新版本)。如果我将我的代码编译到静态库中,我可以假设编译器兼容性(显然在同一个操作系统上)对客户端来说应该不是问题吗?
编辑
进一步澄清:如果我向客户提供一个使用 gcc 4.5.2 编译的静态链接库,那么在他们必须使用的编译器和版本方面,这对该库的用户有什么限制?
【问题讨论】:
标签:
c++
gcc
compiler-construction
binary-compatibility
【解决方案1】:
刚刚遇到这个问题,我相信它回答了我来自http://gcc.gnu.org/bugs/#nonbugs 的问题:
ABI 更改 C++ 应用程序二进制文件
接口(ABI)由两个
组件:第一个定义如何
类的元素布局,如何
函数被调用,函数如何
名称被破坏等;第二
部分处理的内部
libstdc++ 中的对象。虽然我们
到目前为止,争取一个不变的 ABI
我们不得不修改它
主要版本。如果你改变你的
编译到不同的主要版本
您必须重新编译所有库
包含 C++ 代码。如果你不这样做
您可能会遇到链接器错误或
故障程序。我们的一些
Java 支持库还包含
C++ 代码,所以你可能想要
重新编译所有库以确保安全。它
不需要重新编译
如果您已更改为错误修复
发布相同版本的
编译器;错误修复版本很小心
以避免 ABI 更改。另见
GCC 的兼容性部分
手册。
备注:指定主要版本
通过更改第一个或第二个
两部分或三部分的组成部分
版本号。次要(错误修复)
发布是由更改指定
仅第三个组件。因此 GCC 3.2
和 3.3 是主要版本,而
3.3.1 和 3.3.2 是 GCC 3.3 的错误修复版本。有了 3.4 系列,我们
正在引入新的命名方案;
这个系列的第一个版本是
3.4.0 而不仅仅是 3.4。
据我了解,我需要确保客户将我的库与 gcc 的主要版本兼容版本链接。
【解决方案2】:
提供静态库还是动态库并不重要,用户仍然需要使用兼容的编译器/链接器来链接它。通常当 GCC 进行 ABI 更改时,他们会提供一个可以设置为使用旧 ABI 的开关。我知道他们在从 3.x 升级到 4.x 甚至 4.x 系列中的几个版本时都这样做了。