C++库兼容性

发布于 2024-10-11 23:38:07 字数 205 浏览 4 评论 0原文

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

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

I am currently writing a library and am considering moving from GCC 4.1.2 to 4.5.2 (latest release) of GCC. If I compile my code into a static library can I assume compiler compatibility (on the same OS obviously) should be a non-issue for clients?

EDIT
To further clarify: if I provide a client a statically linked library compiled with gcc 4.5.2, what restrictions does this place on users of this library in terms of the compiler and version they must use?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

赠佳期 2024-10-18 23:38:07

刚刚遇到这个,我相信它回答了我的问题 http://gcc.gnu.org/bugs/#非错误

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 的主要版本兼容版本链接起来。

Just came across this which I believe answers my question from http://gcc.gnu.org/bugs/#nonbugs:

ABI changes The C++ application binary
interface (ABI) consists of two
components: the first defines how the
elements of classes are laid out, how
functions are called, how function
names are mangled, etc; the second
part deals with the internals of the
objects in libstdc++. Although we
strive for a non-changing ABI, so far
we have had to modify it with each
major release. If you change your
compiler to a different major release
you must recompile all libraries that
contain C++ code. If you fail to do so
you risk getting linker errors or
malfunctioning programs. Some of our
Java support libraries also contain
C++ code, so you might want to
recompile all libraries to be safe. It
should not be necessary to recompile
if you have changed to a bug-fix
release of the same version of the
compiler; bug-fix releases are careful
to avoid ABI changes. See also the
compatibility section of the GCC
manual.

Remark: A major release is designated
by a change to the first or second
component of the two- or three-part
version number. A minor (bug-fix)
release is designated by a change to
the third component only. Thus GCC 3.2
and 3.3 are major releases, while
3.3.1 and 3.3.2 are bug-fix releases for GCC 3.3. With the 3.4 series we
are introducing a new naming scheme;
the first release of this series is
3.4.0 instead of just 3.4.

From this as I understand it I'll need to ensure clients are linking my library in with a major-release compatable version of gcc.

聆听风音 2024-10-18 23:38:07

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

It doesn't really matter if you are providing a static library or dynamic library, the users will still need to use a compatable compiler/linker to link against it. Usually when GCC does a ABI change they offer a switch that can be set to use the old ABI. I know that they did that when they went from 3.x to 4.x and even a couple of the releases within the 4.x series.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文