我目前正在编写一个库,正在考虑从GCC 4.1.2移动到GCC的4.5.2(最新版本)。如果我将我的代码编译成静态库,我可以假设编译器兼容性(显然在相同的操作系统上)对于客户端应该是非问题吗?
修改 为了进一步澄清:如果我向客户端提供一个使用gcc 4.5.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系列中的几个版本时,他们就这样做了。