跟踪C++;lib公共API更改 我目前正在研究基于大型C++的基于Qt的项目,它将在其公共API的一个主要因素下进行,最好有一个工具,可以生成一个关于从构建到构建中添加或移除了哪些方法的报告。 我知道有一个java工具可以做这个,我想可能有.NET的一个,但是我在搜索之后找不到C++的任何东西。
有人存在吗。跨平台会很好,或者如果只在Linux中也可以。如果您使用Doxygen或类似工具来记录API,那么您可以跟踪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和
diff
目录
- 这是你无论如何都应该做的事情。
- (您还可以告诉Doxygen查找未记录的函数。)
- 您可以轻松地将其应用于古老的签入,而无需更改任何内容
- Doxygen及其同僚对该语言有足够的了解,对
和private
非常敏感public
- 此解决方案可以应用于多种语言,并且不依赖于特定的IDE
- 不需要第三方软件(考虑到您已经有了文档生成器)
dumpbin
?)上使用nm
)转储导出函数的列表。使用一些脚本语言去除在不同版本之间变化的不重要部分,如地址
每次生成后,将此文件提交到版本控制。然后您可以看到每个构建的差异
因为它是C++应用程序,名称也会捕获参数类型的变化。
,而不是允许所有可见符号自动从库导出,可以使用导出的符号的显式列表。对于较大的库,甚至建议这样做
如果您使用git,您应该创建一个新的分支,并使用shell脚本来比较在分支之间定义API B的所有头文件。如果您还没有这样做,那么应该对API头文件使用impl模式,以使库二进制兼容/更稳定,以供将来的版本使用。查看Qt开发者wiki中的条目或KDE techbase中的关于部分。查看商业列表底部的apidiff,我认为这将是最接近的匹配项 使用“nm”的建议并不坏,您可以运行
nm <binary_or_lib> | c++filt
nm | c++过滤器
它将生成一个像样的快照,这将需要大量的后处理
有很多方法可以让你在这一点上独树一帜:
是一种以UML为核心的重量级工具,但它可以逆向设计现有的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之外没有人需要它们。我不认为这是必然的事实。一个类的定义可能是跨类的