我是计算机世界的新手。 我的目的是找出一种在Linux上安装新软件时解决循环依赖关系的通用方法(如果存在)。在这里,我使用谷歌浏览器的情况来更好地说明我的问题。在安装Google Chrome时(使用包管理器和apt-get)我遇到以下问题:
Selecting previously unselected package google-chrome-stable.
(Reading database ... 262709 files and directories currently installed.)
Preparing to unpack google-chrome-stable_current_amd64.deb ...
Unpacking google-chrome-stable (55.0.2883.87-1) ...
dpkg: dependency problems prevent configuration of google-chrome-stable:
google-chrome-stable depends on libappindicator1; however:
Package libappindicator1 is not installed.
要解决上述错误,我尝试安装libappindicator1
,但会返回另一个依赖项错误:
The following packages have unmet dependencies:
libappindicator1 : Depends: libindicator7 (>= 0.4.90) but it is not going to be installed
现在我们遇到循环依赖。尝试安装libindicator7
时收到以下错误:
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
google-chrome-stable : Depends: libappindicator1 but it is not going to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).
正如您所看到的,由于依赖性,我无法安装软件包。现在一种方法是使用apt-get -f install
让Linux神奇地做它的工作。但那不会教会我很多东西。使用这个例子(或建议一个更好的例子),我们能找到一种更好的方法来解决循环依赖问题吗?如果这是一个独立的循环依赖情况安装新软件,或者我在解释错误时犯了错误,那么我可以删除这个问题。
一些有用的链接 -
[1]:https://askubuntu.com/questions/764040/im-having-a-hard-time-installing-google-chrome-on-16-04-lts-please-help [2]:How to solve Cyclic Dependency [3]:How to Solve Circular Dependency [4]:cyclic dependency ... how to solve?
答案 0 :(得分:2)
问题是使用dpkg来安装google-chrome-stable。 DPKG现在安装所需的依赖项并使系统处于损坏状态。
sudo apt install ./google-chrome-stable.deb
这会安装包含所需依赖项的包。
dpkg
只安装一个软件包,因此执行dpkg -i packageName.deb
只会安装此Deb软件包,并会通知您需要安装的任何依赖项,但它会不安装它们,并且它不会配置packageName.deb
,因为那些依赖关系不存在。
apt
是一个包管理系统,用于处理基于Debian的Linux发行版上Deb包的安装。包管理系统是一组工具,可以帮助您轻松地安装,删除和更改包。所以apt
就像一个聪明的dpkg
答案 1 :(得分:2)
DPKG
是自由操作系统Debian及其众多衍生产品中软件包管理系统基础的软件。 dpkg用于安装,删除和提供有关.deb软件包的信息。 dpkg(Debian Package)本身就是一个低级工具。 [1]
APT
(用于高级软件包工具)是一组用于管理Debian软件包的工具,因此也是Debian系统上安装的应用程序。 APT可以安装应用程序,删除应用程序,让您的应用程序保持最新等等。[2]
因此,如果您逐步安装
下载.deb
包后,您可以将其解压缩。解压缩包含的control.tar.gz文件。你会找到一套所有必需的包。
查找特定Debian软件包的所有依赖项。对于谷歌浏览器,你会有像
Package: google-chrome-stable
Version: 55.0.2883.87-1
Architecture: amd64
Maintainer: Chrome Linux Team <chromium-dev@chromium.org>
Installed-Size: 175549
Pre-Depends: dpkg (>= 1.14.0)
Depends: gconf-service, libasound2 (>= 1.0.16), libatk1.0-0 (>= 1.12.4), libc6 (>= 2.11), libcairo2 (>= 1.6.0), libcups2 (>= 1.4.0), libdbus-1-3 (>= 1.1.4), libexpat1 (>= 2.0.1), libfontconfig1 (>= 2.9.0), libfreetype6 (>= 2.3.9), libgcc1 (>= 1:4.1.1), libgconf-2-4 (>= 2.31.1), libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.26.0), libgtk2.0-0 (>= 2.24.0), libnspr4 (>= 2:4.9-2~) | libnspr4-0d (>= 1.8.0.10) | libnspr4 (>= 4.9.5-0ubuntu0), libnss3 (>= 2:3.13.4-2~) | libnss3-1d (>= 3.12.4), libpango1.0-0 (>= 1.14.0), libstdc++6 (>= 4.8.0), libx11-6 (>= 2:1.4.99.1), libx11-xcb1, libxcb1 (>= 1.6), libxcomposite1 (>= 1:0.3-1), libxcursor1 (>> 1.1.2), libxdamage1 (>= 1:1.1), libxext6, libxfixes3, libxi6 (>= 2:1.2.99.4), libxrandr2 (>= 2:1.2.99.3), libxrender1, libxss1, libxtst6, ca-certificates, fonts-liberation, libappindicator1, libnss3 (>= 3.17.2), lsb-base (>= 4.1), xdg-utils (>= 1.0.2), wget
Provides: www-browser
Section: web
Priority: optional
Description: The web browser from Google
Google Chrome is a browser that combines a minimal design with sophisticated technology to make the web faster, safer, and easier.
您需要安装该特定包的所有依赖项。每个依赖项可能依赖于一组其他依赖项。您将拥有这些依赖项的树。您可以手动安装所有这些依赖项,也可以使用apt
或yum
或aptitude
...
这些软件包管理器会为您做什么,他们会为您构建一个依赖树,并在安装Debian软件包之前安装所有相关软件包。
因此,理想情况下,依赖关系树中不应该存在任何循环,但可能是某些现有软件包已经安装并且处于当前安装的较新/旧版本的情况下,并且是必需的软件包。已安装的已安装包。然后你可以在循环依赖循环中结束。
因此,[3]中提到了apt
如何处理循环依赖关系,我认为您可以将其视为手动求解依赖关系的通用算法,但不建议这样做。循环依赖发生在存储库中,但是那些依赖于某些特定规则。通常,这些是紧密绑定的包。因此,它们之间的Depends
关系指定了确切的版本号。