为什么linux不允许中央存储库中有多个版本?

为什么linux不允许中央存储库中有多个版本?

在我看来,使用 Linux 的很多问题都是由于依赖关系不匹配造成的。具体来说,您不能安装库的两个版本。

因此,如果程序 A 需要“lib1.2”而程序 B 需要“lib1.3”,那么它们就不能一起运行。

问题:

  1. 那是对的吗?
  2. 为什么中央存储库不仅支持同时拥有 lib1.2 和 lib1.3 并且程序将获得它们要求的版本?

答案1

在大多数 Linux 发行版中,系统中拥有多个版本的库并不是问题:具有不同版本的共享库索纳梅斯可以共存于同一/usr/lib目录中。此外,可以通过指定正确的包名称来指示包管理器安装多个此类库:

apt-get install libjpeg7
apt-get install libjpeg8

实际上,您可能会遇到该系统的两个缺陷:

  1. 大多数发行版每个发行版仅提供一个库版本以节省空间。例如,我的 Debian Wheezy 只有libjpeg8.您仍然可以libjpeg7从源安装特定的库版本(例如),并且它将与其他版本共存而不会出现问题。您甚至可以尝试安装来自其他发行版的软件包,但要小心,因为它可能会引入大量依赖项。

  2. 有时,具有相同名称(意味着兼容)的两个库版本可以与某些程序配合使用,而不能与其他程序配合使用。顺便说一句,这就是首先拥有多个版本的发行版的主要原因。这种情况下的解决方案是将不兼容的库保留在外部/usr/lib,并让特定程序可以通过 LD_LIBRARY_PATH 或 chroot 访问它们。

答案2

简短回答:

  1. 不。
  2. 对于某些发行版来说,情况就是如此。

更长的答案:

Linux 是内核,而不是发行版。如果您使用类似的发行版尼克斯操作系统,很容易同时安装同一个库的多个版本。

答案3

RE: 您对“在 Windows 中从未见过”的评论

Windows 避免了这种情况,因为几乎每个程序都会在自己的目录中安装它使用的主要库的额外副本,因此最终会安装数十个相同库的副本。这就是为什么您经常看到setup.exe类似的安装程序重新安装相同的库,例如 Direct X 或 Dot Net 或 Visual C。

Windows 确实支持版本化 DLL,类似于 Linux 支持版本化共享库的方式,但 Microsoft 鼓励应用程序开发人员在其应用程序中包含其软件所依赖的特定版本 - 这在前互联网时代可能是必要的,因为在互联网时代,这可能是必需的。用户获取重要库的副本。

在 Linux 中也可以做同样的事情,但是 a) 不鼓励这样做,因为既浪费又懒惰(对于应用程序开发人员和库开发人员来说),b) 默认情况下,Linux 不会在与程序相同的目录中查找对于其共享库 - 它仅在 LD_LIBRARY_PATH 指定的目录中查找。有些程序附带 shell 脚本包装器,可以在运行二进制可执行文件之前更改 LD_LIBRARY_PATH。

相关内容