gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:10:41 26 4
gpt4 key购买 nike

我正在尝试为我的一个项目创建一个 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com