为什么以及如何调试:以下软件包具有未满足的依赖关系,...但不会安装

为什么以及如何调试:以下软件包具有未满足的依赖关系,...但不会安装
$ sudo apt install cuda
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 cuda : Depends: cuda-11-4 (>= 11.4.2) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

“无法安装”是什么意思?为什么?为什么无法安装依赖项?我该如何查找?

“您持有破损包裹”是什么意思?哪些破损包裹?我如何才能查明?

“不可能的情况”是什么意思?我如何才能获得更多详细信息?

相关内容之前也有类似的消息,但目前还没有得到答复。但这里还打印了“您持有破损的包裹”,以及这种“不可能的情况”,所以可能略有不同。

我在这里不是专门询问这个特定的cuda包。我也不是在这里询问如何解决或修复任何问题。我只是询问如何调试理解并且针对任何包一般处理此类apt(或)消息。apt-get

答案1

我完全同意,许多 apt 消息比人们想象的要隐晦得多,而且它们经常甚至具有误导性。不过,好处是,当你使用 apt 一段时间后,你会一遍又一遍地遇到这些消息,并习惯于如何修复它们。

根据您对 apt 幕后工作的了解,可能不太容易理解所有细节。我会尝试一下,希望能猜出您的背景并正确解释您的问题。如果我错了,请多多包涵 :-)

一般来说,您所提到的“将不会安装”或“不可能”的消息是指您正在安装的软件包所需的依赖项与系统上已安装的软件包之间的依赖项。

要理解这一点,您需要知道大多数软件包并未附带它们实际运行所需的所有文件。Linux 习惯是尽可能使用开源软件,因此每个软件包都使用了很多库。这些库是二进制 blob,其中包含可执行文件可以随时使用的函数。问题是,一方面,这些开源项目一直在变化,并且更新非常频繁;另一方面,程序被编码为与特定版本(即开发人员在编译时使用的版本)一起使用。因此,您需要该版本或兼容版本。如果每个开发人员(例如 CUDA 开发人员)都提供他们在编译期间使用的所有库,那将很容易。他们不会这样做,因为大多数都是标准库,其他程序也很可能也会使用它们,这意味着每个程序的下载量和存储所有这些重复数据都会很大(顺便说一下,Docker 或 AppImage 正是这样做的,以提供解决此问题的方法)。由于此问题,您的系统上通常会有多个版本的系统库。但是,当库不兼容或相互冲突时,情况就会变得棘手,例如,因为一次只有一个库可以访问系统资源。在这种情况下,您必须找到与所有使用它们的已安装包兼容的库版本。

这就是 apt 在您每次安装时尝试做的事情。它不是 AI,所以它能做的事情是有限的。不可能出现的情况是,您显然存在冲突,即同时需要两个完全不兼容的库版本。通常,这些不是直接使用的库,而是库需要运行的库。存在整个依赖关系层次结构。对于任何像样的软件,访问 github 并遵循编译说明是非常有益的。在 Linux 中编译确实很容易。但大多数时候,找到并安装所有依赖项都是一场噩梦。如果您没有使用最新版本而是使用旧版本,则不能使用最新的依赖项,但您还需要找出每个依赖项所需的源代码版本。这样做可以很好地了解 apt 的工作情况。因此,消息“它不会被安装”可能是因为所需的库可用并且可以正常工作,但它们的任何依赖项在某个地方都有冲突。

现在,你能做什么?当你跟踪每个冲突,然后找出受影响的其他应用程序,然后决定哪些重要,哪些不重要时,你可以比 apt 更好地解决问题。例如,你可以发现 CUDA 安装的阻止程序是你没有使用的默认消息工具。简单的解决方案是卸载这个和它的所有库(当它们没有在其他地方使用时,apt 会这样做)。之后 apt 可以安装它。不幸的是,我不知道有任何工具可以让你以一种轻松理解和跟踪这些连接的方式浏览这些依赖关系树。

我也遇到过这些情况,第一件事就是尝试 Aptitude。默认情况下它没有安装:

  sudo install aptitude

Aptitude 基本上与 apt 相同,但它更大,并且有更多逻辑来处理这些情况。如果出现这些消息,aptitude 将为您提供选项。有些可能是假的,只需说“否”,您就会得到另一个。例如,它会建议“降级”某个软件包。这意味着安装旧版本。它会建议“删除”某个软件包,或安装其他软件包作为解决方法。问题是它没有告诉您后果是什么,即它没有告诉您“如果您降级这个,应用程序 XYZ 可能不再正常工作”。它只是为您提供摆脱“apt”无法解决的困境的选项。

因此,查看 Aptitude 的建议,看看哪些软件包弹出以及您是否可以自己建立连接是个好主意。您可能会注意到最近安装的工具与之有关。它可能会提示您任何您根本不会使用的东西。卸载它并重试。此外,启动一个带有空白 Ubuntu 的 VM 并尝试在那里安装您的内容也非常有用,因为您可以看到 Ubuntu 版本是否存在开箱即用的冲突。是时候去这样的地方并尽可能具体地发布帖子了。

希望我没有让您感到迷失或厌烦,并且它有点针对您的问题。

现在 apt 的幕后工作相当复杂,因为它是用低级语言编写的,因此很难包含复杂或先进的检测和解析算法。它被设计成一个强大且占用空间小的工具,可以在每个(甚至是最小)系统上运行。事实也确实如此。

相关内容