跟踪C++;lib公共API更改 我目前正在研究基于大型C++的基于Qt的项目,它将在其公共API的一个主要因素下进行,最好有一个工具,可以生成一个关于从构建到构建中添加或移除了哪些方法的报告。 我知道有一个java工具可以做这个,我想可能有.NET的一个,但是我在搜索之后找不到C++的任何东西。

跟踪C++;lib公共API更改 我目前正在研究基于大型C++的基于Qt的项目,它将在其公共API的一个主要因素下进行,最好有一个工具,可以生成一个关于从构建到构建中添加或移除了哪些方法的报告。 我知道有一个java工具可以做这个,我想可能有.NET的一个,但是我在搜索之后找不到C++的任何东西。,c++,qt,api,C++,Qt,Api,有人存在吗。跨平台会很好,或者如果只在Linux中也可以。如果您使用Doxygen或类似工具来记录API,那么您可以diff目录 这是你无论如何都应该做的事情。 (您还可以告诉Doxygen查找未记录的函数。) 您可以轻松地将其应用于古老的签入,而无需更改任何内容 Doxygen及其同僚对该语言有足够的了解,对private和public非常敏感 此解决方案可以应用于多种语言,并且不依赖于特定的IDE 不需要第三方软件(考虑到您已经有了文档生成器) 添加一个自动生成步骤,该步骤在Unix和

有人存在吗。跨平台会很好,或者如果只在Linux中也可以。

如果您使用Doxygen或类似工具来记录API,那么您可以
diff
目录

  • 这是你无论如何都应该做的事情。
    • (您还可以告诉Doxygen查找未记录的函数。)
  • 您可以轻松地将其应用于古老的签入,而无需更改任何内容
  • Doxygen及其同僚对该语言有足够的了解,对
    private
    public
    非常敏感
  • 此解决方案可以应用于多种语言,并且不依赖于特定的IDE
  • 不需要第三方软件(考虑到您已经有了文档生成器)

添加一个自动生成步骤,该步骤在Unix和任何Windows工具(
dumpbin
?)上使用
nm
)转储导出函数的列表。使用一些脚本语言去除在不同版本之间变化的不重要部分,如地址

每次生成后,将此文件提交到版本控制。然后您可以看到每个构建的差异


因为它是C++应用程序,名称也会捕获参数类型的变化。

,而不是允许所有可见符号自动从库导出,可以使用导出的符号的显式列表。对于较大的库,甚至建议这样做


如果您使用git,您应该创建一个新的分支,并使用shell脚本来比较在分支之间定义API B的所有头文件。如果您还没有这样做,那么应该对API头文件使用impl模式,以使库二进制兼容/更稳定,以供将来的版本使用。查看Qt开发者wiki中的条目或KDE techbase中的关于部分。

查看商业列表底部的apidiff,我认为这将是最接近的匹配项

使用“nm”的建议并不坏,您可以运行

nm <binary_or_lib> | c++filt
nm | c++过滤器
它将生成一个像样的快照,这将需要大量的后处理

有很多方法可以让你在这一点上独树一帜:

  • Doxygen可以生成一个XML文件,该文件包含所有类/成员/方法信息,然后可以挖掘这些信息来构建类树。这将是一个比较树木的问题。可以找到一些有用的后处理脚本/实用程序@

  • 如果您使用gcc进行编译,那么这是一种使用中间层生成调用依赖关系图的新方法——似乎使用类似的方法来生成基本API信息并不困难

  • 将生成编译代码的XML表示,这比Doxygen的级别低一点,因为它提供了一种编写包装器代码的机制

  • ,python模块将生成标题的良好python对象表示,从而提供生成API映射的简单方法

  • 生成可能会被处理的标记数据库。不过,C++的命名空间也有问题。

  • 一些商业解决方案

  • scitool's在映射软件方面做得很好,并且有一个用于查询其数据库的perl API

  • 是一种以UML为核心的重量级工具,但它可以逆向设计现有的C++代码库,生成元信息。

  • 这似乎是一个相当实惠的工具,并且考虑到标准(跨平台,C++)可能是最接近的匹配


  • 除了使用Doxygen来滚动您自己的分析工具之外,我还建议您考虑使用。这允许您访问由MS编译器生成的代码/类浏览器信息,并且是免费的。该工具包提供对所有定义、使用参考、源代码和行号、参数、访问修饰符等的编程访问。名称以其损坏的形式提供,并包括必要时将其转换为人类可读格式的工具

    以下是我正在从事的一个项目的一些非常基本的输出:

    IXConnection (struct_name)
    IXConnection::STATE (enum_name)
    IXConnection::setState(enum STATE) (mem_func public)
    IXConnection::setAccount(struct IXAccount *) (mem_func public)
    IXConnection::setDisplayName(class String *) (mem_func public)
    IXConnection::setProtocolData(void *) (mem_func public)
    IXConnection::getState(enum STATE *) (mem_func public)
    IXConnection::getAccount(struct IXAccount * *) (mem_func public)
    IXConnection::getProtocol(struct IXProtocol * *) (mem_func public)
    IXConnection::getPassword(class String * *) (mem_func public)
    IXConnection::getDisplayName(class String * *) (mem_func public)
    IXConnection::getProtocolData(void * *) (mem_func public)
    IXConnection::setProgress(class String *,int,int) (mem_func public)
    IXConnection::notice(class String *) (mem_func public)
    IXConnection::error(enum REASON,class String *) (mem_func public)
    
    试试看。此工具从二进制兼容性的角度显示API中添加/删除的符号、参数/数据类型的更改以及其他更改。是跨平台的。Linux上的性能最好,但它也可以在Windows和Mac上运行

    用法:

    abi-compliance-checker -lib NAME -old OLD.abidump -new NEW.abidump
    
    *.abidump文件是工具生成的ABI转储

    此Qt库是使用以下工具创建的:


    请在下面的评论中提出任何使用问题。

    您是否使用任何版本控制工具?它可能提供一个生成xml报告的diff工具…使用Git进行版本控制我不使用Git,但是如果您使用API的公开部分中显示的内容,我认为您可以获得一个关于两个版本的API之间发生了什么变化的体面报告…您可能还希望将旧API标记为已弃用,而不是将其删除。这样,如果仍然使用这种方法,编译器将发出警告。当然,这取决于编译器,但是
    \uuuuuu属性\uuuuuuu((\ uuuu弃用的\uuuuuuuuu))
    将对gcc起作用。链接:和导出的符号不会公布它们是私有的还是公共的。@spraff:是的,但这有什么关系?因为私有符号不是公共API的一部分?@Spraff:实际上,使用导出符号的显式列表可以排除所有私有符号。DLL之外没有人需要它们。我不认为这是必然的事实。一个类的定义可能是跨类的