在Debian包中支持多个Boost版本



我正试图为我的一个项目创建一个debian包,但在boost版本支持方面遇到了问题。

我确实看过这个问题。这是类似的,但提供的解决方案(Build Dependens)并不真正适用于我,因为我正在制作二进制安装程序。

基本上,我安装的库和可执行文件总是链接到libboost_。我正在使用CPack制作debian包,我的依赖行看起来像:

SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libboost-dev (>= 1.46),
                                  libboost-thread-dev (>= 1.46),
                                  libboost-signals-dev (>= 1.46),
                                  libboost-system-dev (>= 1.46), 
                                  libboost-filesystem-dev (>= 1.46),
                                  libboost-python-dev (>= 1.46), ..." )

我需要为所述平台上的每个平台或该平台的增强版本构建单独的安装程序吗?

虽然我理解你想要创建一个适用于所有增强版本的包的意图,但你真的必须问问自己这是否真的可行。

.so版本(例如.so.1.46.so.1.48)的思想实际上是指示库接口(ABI)已经改变,这基本上指示库不兼容。

因此,链接到libboost_foo.so.1.46的应用程序实际上不太可能使用libboost_foo.so.1.48。很可能是应用程序所需的符号突然消失了(所以应用程序将拒绝启动)。更糟糕的是,符号的含义可能在不同版本之间发生了变化,导致难以跟踪未定义的行为。

这就是为什么每当你链接到libfoo.so时,二进制文件就真正链接到libfoo.so.1(或者libfoo.so真正指向的地方)的原因

现在debian的策略是,对于任何不兼容的ABI更改,包名称都必须更改。这基本上允许用户同时安装同一库的两个版本(例如boost-1.46和boost-1.49)

如果你的目标是特定版本的Debian,你可以确定一个特定版本的库是可用的。例如,在Debian/bretty上,你会得到1.49的支持。因此,如果你提供Debian/shutty的包,你只需要链接到boost-1.49。这也是发布如此出色的原因之一:它在某种程度上保证了所有需要的lbirary都可用。

这也意味着,在多个Debian版本中,您可以拥有相同应用程序的不同包版本,即使没有"上游"版本:由于依赖的升级(涉及soname更改),包必须重建

因此得出结论:

  • 链接到实际的库版本是保持系统正常的一个功能

  • debian允许同时安装同一库的多个版本

解决您的问题:

  • 为任何依赖项的每个soname版本提供二进制包

为每个debian发行版提供包会让这件事看起来不那么麻烦(因为每个发行版只有一组固定的库)。

您可以尝试静态链接boost包:

设置(Boost_USE_STATIC_LIBS ON)

最新更新