我正在研究某个C++库(或更多框架).我想让它向后兼容以前的版本,不仅保留了API兼容性,还保留了ABI(就像Qt那样出色的工作).
我使用Boost的许多功能,对我来说,这使得向后兼容性变得不可能,除非我强迫用户拥有完全相同(有时是旧版本)的Boost.
有没有办法(没有重写1/2 Boost)在其命名空间周围做一些"前缀"/重命名它以防止它干扰用户版本的Boost?
例如,我的libXYZ使用Boost 1.33并且它有类boost::foo
.在版本1.35 boost::foo
升级并添加了新成员,因此,boost::foo
从1.33和1.35不兼容ABI.因此,libXYZ的用户必须使用Boost 1.33或使用Boost 1.35重新编译libXYZ(可能已经以XYZ无法编译的方式破坏了某些API).
注意:我说的是带有ELF的UNIX/Linux操作系统,其中动态链接类似于静态链接,因此您无法链接两个不同版本的库,因为符号会产生干扰.
我可能想到的一个合适的解决方案是将Boost放在其他一些私有命名空间中.因此,libXYZ将使用::XYZ::boost::foo
而不是::boost::foo
.这可以防止与用户可能使用的其他版本的Boost冲突.
因此,libXYZ将继续使用Boost 1.33与其他命名空间静态或动态链接,假设它:
有没有办法用Boost做这些事情?
编辑:最后我决定创建一个脚本,将源中的所有boost符号重命名为某个自定义符号.
基本原理:构建过程的简化,独立于编译器可见性支持,它的可见性仅适用于动态库,对于静态,这不起作用,因此我需要为每种类型的库提供单独的构建和依赖.
该脚本可在那里找到:http://art-blog.no-ip.info/files/rename.py
编辑2:最新版本的Boost BCP支持命名空间重命名.
我有一些写C库的经验,但我从来没有读过任何描述良好实践的正式文档.我的问题主要涉及两个主题:
我可以从我的研究中看到的关于二进制兼容性的主要问题是我可以通过使用pImpl惯用法使库二进制兼容,但是即使在使用pImpl时,更改结构/添加新数据成员等也会影响它的二进制兼容性.另外,有没有办法在不实际破坏二进制兼容性的情况下向库中添加新方法/函数?我假设添加这些东西会改变库的大小,从而破坏兼容性.
有没有工具来检查二进制兼容性?
我已经读过这些文章了.还有其他可以仔细阅读的文档吗?
http://en.wikipedia.org/wiki/Opaque_pointer
http://techbase.kde.org/Policies/Binary_Compatibility_Issues_With_C++
此外,是否有文章描述了在设计库接口的上下文中的内存所有权问题.一般惯例是什么?谁拥有记忆,多长时间,谁负责释放记忆等?
c linux memory-management shared-libraries binary-compatibility
我目前正在研究基于C++ Qt的大型项目,该项目即将在其公共API的重要因素下进行,如果有一个工具可以生成一个报告,该报告已经添加或删除了哪些方法,那将会很不错.构建以构建.
我知道Java有一个工具可以做到这一点,我认为可能有一个用于.NET的工具,但经过一些搜索,我找不到任何适合C++的东西.
是否存在.跨平台会很好,或者只在Linux中也可以.
通过比较代码,可以在编译之前完成吗?有没有工具呢?
c++ automated-tests static-analysis backwards-compatibility binary-compatibility
我知道添加static
成员函数很好,但enum
定义怎么样?没有新的数据成员,只是它的定义.
一点背景:
我需要添加一个static
成员函数(在类中),它将IP
通过其字符串表示来识别(函数)地址的版本.的第一件事,是在我脑海中是申报enum
的IPv4
,IPv6
并且Unknown
,使这个enum
我函数的返回码.
但我不想打破二进制向后兼容性.
一个非常糟糕的问题(对于SO) - 这里有任何来源或问题,我可以阅读更多关于此的内容吗?我的意思是 - 什么打破了二进制兼容性和什么 - 没有.或者它取决于很多东西(比如架构,操作系统,编译器......)?
编辑:关于@PeteKirkham的评论:好的,至少 - 有没有办法测试/检查更改的ABI,或者最好发布有关它的新问题?
EDIT2:我刚刚发现了一个SO问题:静态分析工具来检测C++中的ABI中断 .我认为它在某种程度上与此相关,并回答了关于检查二进制兼容性的工具的部分.这就是我在这里联系它的原因.