我正在研究某个 C++ 库(或更多框架)。我想让它向后兼容以前的版本,不仅保留 API 兼容性,还保留 ABI(就像 Qt 所做的出色工作一样)。
我使用了 Boost 的许多功能,在我看来,这使得向后兼容变得不可能,除非我强迫用户拥有完全相同(有时是旧的)版本的 Boost。
有没有办法(不重写 Boost 的 1/2)在其命名空间周围制作一些“前缀”/重命名它以防止它干扰用户版本的 Boost?
例如我的 libXYZ 使用 Boost 1.33 并且它有 class 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 的最新版本支持命名空间重命名。