我正在尝试为我的一个项目创建一个 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 版本提供软件包将使这比看起来的麻烦少得多(因为每个版本只有一组固定的库)。
关于boost - 在一个 Debian 软件包中支持多个 Boost 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17681721/