如果您已经用 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 更改报告。
关于c++ - 是否有工具可以检查对 C++ 类的更改是否会破坏该类的先前版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18598583/