相关疑难解决方法(0)

使用向后兼容的使用Boost的ABI创建库

我正在研究某个C++库(或更多框架).我想让它向后兼容以前的版本,不仅保留了API兼容性,还保留了ABI(就像Qt那样出色的工作).

我使用Boost的许多功能,对我来说,这使得向后兼容性变得不可能,除非我强迫用户拥有完全相同(有时是旧版本)的B​​oost.

有没有办法(没有重写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 API.
  • 将保持稳定的私有版本的公开API.

有没有办法用Boost做这些事情?

编辑:最后我决定创建一个脚本,将源中的所有boost符号重命名为某个自定义符号.

基本原理:构建过程的简化,独立于编译器可见性支持,它的可见性仅适用于动态库,对于静态,这不起作用,因此我需要为每种类型的库提供单独的构建和依赖.

该脚本可在那里找到:http://art-blog.no-ip.info/files/rename.py

编辑2:最新版本的Boost BCP支持命名空间重命名.

c++ unix compatibility boost abi

24
推荐指数
2
解决办法
6673
查看次数

使用闭源库分发boost

我有一个需要使用某个闭源C++ API的应用程序.此API与一些Boost,二进制库文件和所有文件一起分发.我喜欢在我自己的代码中使用Boost.我不能只使用他们的Boost版本,因为他们没有分发我需要的Boost的所有部分.我该怎么办?目标平台是linux,最终也是Windows.

  • 我不会跨API边界传递Boost对象.
  • 我可以将事物编译为目标文件,以便我的代码使用我的 boost标头,API的代码使用 Boost标头.这部分看起来很简单.
  • 没有得到:如何 我的代码链接我的 Boost库文件,以及API的代码链接到 Boost库文件.我是否需要围绕API编译自己的包装器 - 一个包头,其头部包括Boost - 到动态库?(这是我能想到的唯一方法来进行链接.API的Boost库文件中的符号应该与我的Boost库文件中的符号相同.我必须分两个阶段进行链接,不是吗?唯一的方法我可以链接一个程序,而不是通过制作动态库,不是吗?)

c++ boost multiple-versions

7
推荐指数
1
解决办法
654
查看次数

标签 统计

boost ×2

c++ ×2

abi ×1

compatibility ×1

multiple-versions ×1

unix ×1