API 版本管理与 ABI 稳定性
规划语义化版本,并在各次发布之间保护 ABI 稳定性
API 版本管理与 ABI 稳定性 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
两种不同的兼容性
需要关注两种兼容性:
- 应用程序接口兼容性——针对版本 N 编译的源代码,也能针对 N+1 编译
- ABI 兼容性——针对版本 N 编译的二进制文件无需重新编译,即可与 N+1 配合工作
ABI 为何重要
ABI 兼容性允许在不重新编译依赖方的情况下升级共享库。这对软件发行版、插件和长期运行的应用程序至关重要。
哪些变化会破坏 ABI
许多看似无害的更改都会破坏 ABI:
- 添加、删除或重新排列数据成员
- 添加或删除虚函数
- 更改继承关系
- 更改模板参数
- 更改内联函数(有时)
语义化版本(SemVer)
通过版本号 MAJOR.MINOR.PATCH 表示兼容性:
- MAJOR——不兼容的更改
- MINOR——向后兼容的新功能
- PATCH——修复
在头文件中提供版本信息
请在头文件中提供版本宏。
#define MYLIB_VERSION_MAJOR 2
#define MYLIB_VERSION_MINOR 1
#define MYLIB_VERSION_PATCH 3共享库的 SONAME
在 Linux 上,共享库具有编码主版本号的 SONAME。链接器和加载器使用它来查找兼容版本。
# libmylib.so.2 -> libmylib.so.2.1.3
# SONAME = libmylib.so.2隐藏实现细节
稳定的 ABI 要求不要将实现放在头文件中。请使用 PIMPL(下一课介绍),以便在不影响使用方的情况下添加或删除私有成员。
编译器 ABI
不同编译器之间的 C++ ABI 各不相同(GCC 与 MSVC 使用不同的名称修饰和类布局)。请发布使用特定编译器构建的二进制文件,或坚持使用 extern "C" 接口。
标准库 ABI
标准库也可能破坏 ABI,不过 libstdc++ 和 libc++ 都有相应策略。如果需要跨版本兼容,请避免在稳定的公共应用程序接口中使用标准库类型。
以兼容方式添加功能
安全的添加方式:
- 新增自由函数
- 新增类
- 新增非虚成员函数(需谨慎)
不安全的做法:修改使用方在栈上创建或已编译进其中的类。
ABI 检查工具
用于比较两个构建结果的工具:
- abidiff——比较 ABI
- abicompliance-checker——生成报告
长期策略
请从一开始就为稳定性进行设计:采用小型公共应用程序接口、不透明类型,并谨慎使用模板和继承。一旦发布,破坏 ABI 的代价就很高——将不兼容的更改限定在主版本升级中,并清晰地进行沟通。
快速检查
对 C++ 类进行哪种更改最有可能破坏 ABI?
回顾
应用程序接口兼容性意味着源代码兼容性;ABI 兼容性意味着二进制兼容性。ABI 很脆弱——添加成员、虚函数或更改继承关系都会破坏它。请使用 SemVer,通过 PIMPL 隐藏实现,同时发布多个主版本,并运行 ABI 检查工具。
用 AI 导师学习 C++ — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 51
- 课程
- 203
常见问题解答
「API 版本管理与 ABI 稳定性」课时是免费的吗?
是的 — 「API 版本管理与 ABI 稳定性」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「API 版本管理与 ABI 稳定性」这节课中我会学到什么?
规划语义化版本,并在各次发布之间保护 ABI 稳定性 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「API 版本管理与 ABI 稳定性」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 仅头文件库与编译库
- API 版本管理与 ABI 稳定性
- 使用 PIMPL 隐藏实现
- 编写现代的仅头文件实用工具库