c++ - 是否有工具可以检查对 C++ 类的更改是否会破坏该类的先前版本?

标签 c++ abi

如果您已经用 C++ 编程了一段时间,您可能运行了一个“没有明显原因”崩溃的程序,发现该库的 ABI 不再兼容,您所要做的就是重新编译软件针对新版本的库。

ABI 中断的原因有多种:虚拟表的更改、添加/删除构造函数、析构函数或变量成员...

我想知道的是:是否有一个工具可以用来比较两个类定义(旧版本和当前版本)并告诉我它们是否 ABI 兼容。

这对于确定我的项目的版本很有用(即,如果 ABI 更改,我将从 1.2.7 转到 1.3.0,如果 ABI 没有更改,我只需转到 1.2.8)。

很多使用 C++ 编程的人都遇到过这个问题。一个很好的例子是 Qt,它明确指出补丁不会破坏二进制兼容性(虽然偶尔会犯错误,但一般来说,他们的代码相当可靠)。

http://qt-project.org/wiki/Qt-Version-Compatibility
http://qt-project.org/faq/answer/is_qt_binary_compatible

但是,Qt 的工作人员可以花时间验证(全部手动?)公共(public)类没有以破坏兼容性的方式进行更改。对于许多较小的 C++ 项目,我无法说那么多。

最佳答案

在 Linux 上有一个 abi-compliance-checker工具。它可用于验证 C++ 库的向后二进制兼容性。请参阅 Qt 库工具的示例报告:http://abi-laboratory.pro/tracker/timeline/qt/

您需要使用附加 -g -Og 选项编译库的调试版本,并在 abi-dumper 的帮助下转储库的 ABI工具。然后比较不同版本的两个 ABI 转储以生成 ABI 更改报告。

enter image description here

关于c++ - 是否有工具可以检查对 C++ 类的更改是否会破坏该类的先前版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18598583/

相关文章:

linux - 在i386和x86-64上UNIX和Linux系统调用的调用约定是什么

c++ - 如何正确使用 C++ 中的 Detour 库来实现具有已知内存地址的函数的简单 Hook ?

C++ 数组(初学者)

c++ - 使用模板实现通用字符串解析器

c++ - 命名空间嵌套函数的最佳实践和语义以及extern "C"的使用

c++ - ARM 设备的交叉编译库

android - 仅支持 armeabi 和 x86 的 android 库的问题

c++ - 带有英特尔 C++ 编译器的 Armadillo 错误

c++ - 不完整类型和前向声明的无效使用

android - Flutter 大 apk 大小并针对不同的 ABI 发布