2

如果你已经用 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 的员工可以花时间验证(全部手动?)公共类没有以破坏兼容性的方式进行更改。我不能说那么多更小的 C++ 项目。

4

2 回答 2

2

形式上,如果您更改了类定义中的任何标记,它们是不兼容的。否则......我不知道任何工具,因为如果他们改变了任何东西,大多数人都不会接受风险。而且由于大多数人将使用 make 或类似的东西,只要标题中的任何更改(包括更正注释中的拼写错误),他们将直接或间接地自动重新编译所有包含标题的源。

如果您一直在使用文件时间戳,那么唯一的问题就来了。答案是:不要这样做。

最后,为了管理版本,只要我更改任何可能更改界面的内容,我都会更改版本(在我自己的构建结构之外可见)。而且我将版本号修改到库命名空间中,因此您无法将代码与错误版本的库链接。但这只有在您将库和标题交付给其他人时才真正需要。(甚至可能不会——我认识的大多数程序员在升级他们正在使用的任何库时都会自动进行干净的构建。)

于 2013-09-03T18:04:56.007 回答
1

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

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

在此处输入图像描述

于 2016-02-09T22:09:28.830 回答