5

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

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

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

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

4

2 回答 2

3

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

.so版本(例如.so.1.46vs )的想法.so.1.48实际上是表明库接口(ABI)发生了变化,这基本上表明库不兼容。

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

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

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

如果您的目标是特定版本的 Debian,您可以确保特定版本的库可用。例如,在 Debian/wheezy 上,您将拥有 boost-1.49。所以如果你提供来自 Debian/wheezy 的软件包,你只需要链接 boost-1.49。这也是版本如此出色的原因之一:它保证了所有需要的图书馆都可用。

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

所以得出结论:

  • 链接到实际的库版本是保持系统健全的一项功能

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

您的问题的解决方案:

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

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

于 2013-07-18T08:31:59.243 回答
1

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

设置(Boost_USE_STATIC_LIBS ON)

于 2013-07-21T17:36:08.620 回答