voi*_*ptr 23 c linux memory-management shared-libraries binary-compatibility
我有一些写C库的经验,但我从来没有读过任何描述良好实践的正式文档.我的问题主要涉及两个主题:
我可以从我的研究中看到的关于二进制兼容性的主要问题是我可以通过使用pImpl惯用法使库二进制兼容,但是即使在使用pImpl时,更改结构/添加新数据成员等也会影响它的二进制兼容性.另外,有没有办法在不实际破坏二进制兼容性的情况下向库中添加新方法/函数?我假设添加这些东西会改变库的大小,从而破坏兼容性.
有没有工具来检查二进制兼容性?
我已经读过这些文章了.还有其他可以仔细阅读的文档吗?
http://en.wikipedia.org/wiki/Opaque_pointer
http://techbase.kde.org/Policies/Binary_Compatibility_Issues_With_C++
此外,是否有文章描述了在设计库接口的上下文中的内存所有权问题.一般惯例是什么?谁拥有记忆,多长时间,谁负责释放记忆等?
R..*_*R.. 21
关键兼容性问题是:
#define
/ enum
共享标头中的常量值所以我能给出的最佳指导清单是:
dup
对dup2
或wait
对waitpid
).struct
类型).#define
/ enum
常量.仅添加具有先前未使用的值的新常量.如果您遵循这些指导原则,我认为您的覆盖率至少达到95%.
有没有工具来检查二进制兼容性?
ABI Compliance Checker - 用于检查共享C/C++库(DSO)的后向二进制兼容性的工具.
还有其他可以仔细阅读的文档吗?
请参阅这篇关于共享库的二进制兼容性的文章.
如何设计保持向后兼容的接口?
的使用保留/填充字段是保存的相容性的一般方法Ç库.但也有很多其他人.
另外,有没有办法在不实际破坏二进制兼容性的情况下向库中添加新方法/函数?我假设添加这些东西会改变库的大小,从而破坏兼容性.
添加的C函数不会破坏Linux和Mac上DSO的后向二进制兼容性.在Windows和Symbian上也是如此,但是您应该只将新函数添加到.DEF文件的末尾.尽管如此,前向兼容性总是会被添加的功能打破.
添加C++方法会破坏二进制兼容性,当且仅当它们是虚拟或纯虚拟的时,因为v-table的布局可能会发生变化.但你的问题似乎只是关于C库.
归档时间: |
|
查看次数: |
6673 次 |
最近记录: |