在Debian软件包中支持多个Boost版本

时间:2013-07-16 16:11:48

标签: boost installer cmake debian cpack

我正在尝试为我的项目创建一个debian软件包,但是在增强版支持方面遇到了问题。

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

基本上,我安装的库和可执行文件总是链接到libboost_(组件).so.1.46而不是符号链接库libboost_(组件).so。离开我的debian安装程序只能由我的确切提升版本的人使用。我正在使用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), ..." )

我是否需要为所述平台上的每个平台或该平台的升级版本构建单独的安装程序?

2 个答案:

答案 0 :(得分:1)

虽然我理解你想要创建一个适用于所有升级版本的软件包的强度,但你真的要问问自己这是否真的可行。

.so版本(例如.so.1.46 vs .so.1.48)的想法实际上是指示库接口(ABI)has changed,它基本上表示库不兼容。< / p>

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

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

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

如果您要定位特定版本的Debian,则可以确保可以使用特定版本的库。例如在Debian / wheezy你会得到提升-1.49。 因此,如果你提供Debian / wheezy的软件包,你只需要链接boost-1.49。 这也是发行版如此出色的原因之一:它保证了所有需要的lbiraries可用。

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

总结如下:

  • 链接到实际的库版本是一项让您的系统保持理智的功能

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

解决您的问题的方法:

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

为每个debian 发布提供软件包将使它比看起来更麻烦(因为每个版本只有一组固定的库)。

答案 1 :(得分:1)

你可以尝试做的是静态链接boost包:

设置(Boost_USE_STATIC_LIBS ON)