$ 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
)消息,对于任何包。
我完全同意,许多 apt 消息比人们想要的要神秘得多,而且它们通常甚至具有误导性。然而,好消息是,在使用 apt 一段时间后,您会一遍又一遍地遇到这些消息,并习惯于如何修复它们。
根据您对 apt 在幕后所做的事情的了解,了解所有细节可能并不容易。我会试一试,希望能猜出你的背景并正确解释你的问题。如果我弄错了,请多多包涵:-)
通常,您提到的“将不会安装”或“不可能”的消息是指您正在安装的软件包与系统上已经安装的数据包所需的依赖关系。
要理解这一点,您需要知道大多数软件包并未附带它们实际需要运行的所有文件。Linux 自定义是尽可能使用开源软件,所以每个包都使用了很多库。那是二进制 blob,其中填充了可执行文件可以即时使用的函数。麻烦的是,一方面这些开源项目一直在变化并且得到非常频繁的更新,另一方面程序被编码为使用特定版本,即开发人员在编译时一直使用的版本。所以你需要那个版本或兼容的版本。如果每个开发人员(例如 CUDA)都提供他们在编译期间使用的所有库,那将很容易。他们不 因为大多数标准库很可能也被其他程序使用,这意味着每个程序都需要大量下载和存储所有这些重复数据(顺便说一下,Docker 或 AppImage 正是这样做以提供解决方案到这个问题)。由于这个问题,您的系统上通常有多个版本的系统库。然而,当库不兼容或相互冲突时,它会变得很棘手,例如,因为一次只有一个库可以访问系统资源。在这种情况下,您必须找到与所有使用它们的已安装数据包兼容的库版本。由于这个问题,您的系统上通常有多个版本的系统库。然而,当库不兼容或相互冲突时,它会变得很棘手,例如,因为一次只有一个库可以访问系统资源。在这种情况下,您必须找到与所有使用它们的已安装数据包兼容的库版本。由于这个问题,您的系统上通常有多个版本的系统库。然而,当库不兼容或相互冲突时,它会变得很棘手,例如,因为一次只有一个库可以访问系统资源。在这种情况下,您必须找到与所有使用它们的已安装数据包兼容的库版本。
这就是 apt 尝试为您所做的每次安装所做的事情。它不是人工智能,所以它可以做的事情是有限的。消息不可能的情况是您显然存在冲突,同时需要两个绝对不兼容的库版本。这些通常不是直接使用的库,而是库需要运行的库。有一个完整的依赖层次结构。到 github 获取任何体面的软件并遵循编译说明非常有启发性。在 Linux 中编译非常简单。但大多数时候,找到并安装所有依赖项是一场噩梦。如果您使用的不是最新版本而是旧版本,则不能使用最新的依赖项,但您还需要找出每个依赖项所需的源代码版本。这样做会给人很好的感觉 apt 正在使用什么。因此,“它不会被安装”的消息可能会导致所需的库可用并且可以正常工作,但是它们的任何依赖项都存在冲突。
现在,你能做什么?当你追踪每一个冲突,然后找出其他应用程序受到影响,然后决定哪些重要,哪些不重要时,你可以比 apt 更好地解决它。例如,您可能会发现您的 CUDA 安装拦截器是一个默认的 Messenger 工具,您无论如何都不会使用。简单的解决方案是卸载这个及其所有库(当它们没有在其他任何地方使用时,apt 会这样做)。之后apt可以安装它。不幸的是,我不知道有任何工具可以让您以轻松理解和跟踪这些连接的方式浏览这些依赖关系树。
我也有这些情况,第一件事是尝试 Aptitude。默认情况下未安装:
Aptitude 与 apt 基本相同,但它更大,并且有更多的逻辑来处理这些情况。如果出现这些消息,aptitude 将为您提供选项。有些可能是假的,只要说“不”,你就会得到另一个。例如,它会建议“降级”一个包。这意味着安装旧版本。它会建议“删除”一个包,或安装其他包作为解决方法。麻烦的是它没有告诉你后果是什么,即它没有告诉你“如果你降级,应用程序 XYZ 可能不再正常工作”。它只是为您提供了摆脱“apt”无法解决的困境的选择。
因此,查看 Aptitude 的建议,看看弹出哪些包以及是否可以自己建立连接是个好主意。您可能会注意到您最近安装了一个工具。它可能会提示您无论如何都不使用的任何内容。卸载它并重试。还启动一个带有空白 Ubuntu 的 VM 并尝试在那里安装你的东西可能非常有用,因为你会看到 Ubuntu 版本是否存在开箱即用的冲突。他们是时候到达这样的地方并尽可能具体地发布帖子了。
希望我既没有失去你也没有让你感到无聊,它有点针对你的问题。
现在 apt 在幕后相当复杂,因为它是用低级语言编写的,因此很难包含复杂的或先进的检测和解析算法。它是一个强大且占用空间小的工具,可在每个(甚至最小的)系统上运行。就是这样。