Debian 共享库设置

Debian 共享库设置

我有一个用于共享库的 Debian 软件包。假设该库名为 threadx。我安装的是0.0.1版本。所以这个包包含:

/lib/i386-linux-gnu/libthreadx.so.0.0.1
/lib/i386-linux-gnu/libthreadx.so.0 # symlink to libthreadx.so.0.0.1

如果我现在想升级到 0.0.2,该软件包将包含:

/lib/i386-linux-gnu/libthreadx.so.0.0.2
/lib/i386-linux-gnu/libthreadx.so.0 # symlink to libthreadx.so.0.0.2

哪个冲突,因为/lib/i386-linux-gnu/libthreadx.so.0是同一个文件。错误信息是

dpkg: error processing archive /tmp/apt-dpkg-install-SwpeYD/01-libthreadx0.0.2_0.0.2_i386.deb (--unpack):
 trying to overwrite '/lib/i386-linux-gnu/libthreadx.so.0', which is also in package libthreadx0.0.1:i386 0.0.1

我希望能够并行安装两个包(libthreadx0.0.1libthreadx0.0.2),并使符号链接指向最新的库。

我无法找到如何配置/打包这个有效的实际建议。有这个线程谈论它,但没有透露任何细节:

实际上,如果操作正确,您可以安装共享库的多个版本。

为什么我无法安装共享库的多个版本?

而且 debian 手册对我来说也很晦涩,所以要么没有关于如何执行此操作的信息,要么我不理解它。https://www.debian.org/doc/debian-policy/ch-sharedlibs.html

答案1

问题来自于包名称中存在完整版本:libthreadx0.0.2libthreadx0.0.1。当您安装前者时,dpkg并不认为它是后者的升级,而是与它一起安装的新软件包。因此,dpkg不会自动为您处理“替换”文件,您必须提供其他信息来帮助它执行此操作。

libthreadx.so.0理论上,在本例中,库包名称应该反映库的 soname ;所以库包应该是libthreadx0,下划线后带有适当的版本号:libthreadx0_0.0.1-1_i386.deb, libthreadx0_0.0.2-1_i386.deb。但正如您所注意到的,这不允许并行安装。

由于您希望允许并行安装,因此必须允许包含该库的更高版本的包来替换早期包中的符号链接:您可以通过添加来做到这一点Replaces在包的控制文件中,例如在本例中,在libthreadx0.0.2的控制文件中,

Replaces: libthreadx0.0.1

这并不意味着libthreadx0.0.2完全取代libthreadx0.0.1,但它允许它提供冲突的文件。libthreadx0.0.2安装后,其符号链接将替换libthreadx0.0.1's。

从技术上讲,由于这改变了符号链接,它“破坏”了(术语dpkglibthreadx0.0.1包 - 或者更确切地说,它破坏了依赖于 的包libthreadx0.0.1,因为它们将不再通过以前由 提供的符号链接找到正确的库libthreadx0.0.1。这通常也会使用Breaks节来声明,但这在这里不合适,因为您想保留libthreadx0.0.1.

如果用户安装libthreadx0.0.1、安装libthreadx0.0.2、然后删除libthreadx0.0.2并期望libthreadx0.0.1再次使用,这也会导致设置损坏:符号链接将不会恢复。

事实上,您的 soname 在两个库中都是相同的,这表明它们并不是真正的可用的首先是并行的,但这是另一个讨论的问题。

相关内容