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