8

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

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

4

2 回答 2

8

刚刚遇到这个,我相信它回答了我来自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 的主要版本兼容版本链接起来。

于 2011-01-16T14:29:38.647 回答
1

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

于 2011-01-16T16:21:53.503 回答