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

标签 boost installation cmake debian cpack

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

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

基本上,我安装的库和可执行文件总是链接到 libboost_(component).so.1.46 而不是符号链接(symbolic link)库 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), ..." )

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

最佳答案

虽然我理解你想要创建一个适用于所有 boost 版本的包的意图,但你真的必须问自己这是否真的可行。
.so 的想法版本(例如 .so.1.46 vs .so.1.48 )实际上表明库接口(interface)(ABI)has changed ,这基本上表明库不兼容。

因此,您的应用程序链接到 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 上,您将拥有 boost-1.49。
所以如果你提供来自 Debian/wheezy 的软件包,你只需要链接 boost-1.49。
这也是版本如此出色的原因之一:它保证了所有需要的图书馆都可用。

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

所以得出结论:

  • 链接到实际库版本是保持系统健全的一项功能
  • debian 允许同时安装同一个库的多个版本

  • 您的问题的解决方案:
  • 为任何依赖项的每个 soname 版本提供二进制包

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

    关于boost - 在一个 Debian 软件包中支持多个 Boost 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17681721/

    相关文章:

    c - 如何在 CLion 中添加链接器标志

    c++ - 如何避免在不适当的线程上下文中破坏 shared_ptr?

    c++ - 在C++中退出具有三个线程的两个并发队列

    linux - 制作安装和环境变量

    java - 如何使Java程序可安装?

    windows - 通过在 Linux 上引导,然后交叉编译,从源代码构建适用于 Windows 的 CMake

    c++ - 如何使用Boost解析ini文件

    c++ - boost::variant 对象的 getter

    c# - 通过命令行传递安装路径 - installshield

    c++ - 带有 boost 的 CMake(在 Windows 上):Could not find libraries?