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

时间:2013-09-03 17:56:25

标签: 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的工作人员可以花时间验证(全部手动?)公共类没有以破坏兼容性的方式进行更改。我不能说很多更小的C ++项目。

2 个答案:

答案 0 :(得分:2)

正式地,如果您更改了类定义中的任何标记, 他们不兼容。否则......我不知道任何工具, 因为如果他们改变了,大多数人都不会接受风险 任何东西。因为大多数人都会使用make或者其他东西 类似,任何时候标题中的任何变化(包括 他们会自动纠正评论中的拼写错误 直接重新编译包含标题的所有源代码 或间接地。

唯一的问题是,如果你一直在玩这个 文件时间戳。答案就是:不要这样做。

最后,为了管理版本,我更改了版本(可见 在我自己的构建结构之外)随时我改变任何东西 可能会改变界面。而且我破坏了版本号 进入库名称空间,所以你无法链接代码 错误的库版本。但这确实是必要的 如果您将图书馆和标题提供给其他人。 (甚至可能不是那么 - 我认识的大多数程序员都会 每当他们升级任何一个时自动执行干净的构建 他们正在使用的图书馆。)

答案 1 :(得分:1)

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

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

enter image description here