首页 文章

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

提问于
浏览
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项目 .

2 回答

  • 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

  • 2

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

    如果你一直在玩文件时间戳,那么唯一的问题就出现了 . 答案就是:不要这样做 .

    最后,为了管理版本,我随时更改了可能会改变界面的任何内容,我会更改版本(在我自己的构建结构之外可见) . 我将版本号修改为库命名空间,因此您无法将代码与错误版本的库链接 . 但是,如果您将图书馆和 Headers 提供给其他人,这实际上是必要的 . (甚至可能不是这样 - 我知道的大多数程序员在升级他们正在使用的任何库时都会自动执行干净的构建 . )

相关问题