Chinaunix首页 | 论坛 | 博客
  • 博客访问: 300607
  • 博文数量: 81
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 952
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-31 22:05
文章分类

全部博文(81)

文章存档

2011年(1)

2010年(1)

2009年(79)

我的朋友

分类: LINUX

2009-09-04 18:48:48

问题回放:这一次的升级由于一次错误的操作,就是换了ubuntu 8.10 软件源后,升级之前没有做必要的更新。(请参照,旧贴:通过网络升级安装Ubuntu 8.10 Intrepid Ibex 红色标记部分)导致升级以后编译环境自动失效,同时安装gtk也装不上去。

具体状况:
代码:
open-baike@open-baike-desktop:~$ sudo apt-get install gnome-devel
[sudo] password for open-baike:
正在读取软件包列表… 完成
正在分析软件包的依赖关系树
正在读取状态信息… 完成
有一些软件包无法被安装。如果您用的是不稳定(unstable)发行版,这也许是
因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件
包尚未被创建或是它们还在新到(incoming)目录中。

您仅要求对单一软件包进行操作,这极有可能是因为该软件包安装不上,同时,
您最好提交一个针对这个软件包的故障报告。
下列的信息可能会对解决问题有所帮助:

下列的软件包有不能满足的依赖关系:
gnome-devel: 依赖: gnome-core-devel (= 1:2.22.2~4ubuntu2) 但是它将不会被安装
E: 无法安装的软件包


简单分析,确定问题包:
上述问题中已经提示关键点gnome-core-devel不能被安装。
那么单独安装gnome-cor-devel以确定问题包
同样提示的信息大同小异
下列的软件包有不能满足的依赖关系:
代码:
gnome-core-devel: 依赖: libtotem-plparser-dev (>= 2.22.3) 但是它将不会被安装
E: 无法安装的软件包

继续安装它的依赖包以确定问题,
得到下面提示:
代码:
下列的软件包有不能满足的依赖关系:
libedataserver1.2-dev: 依赖: libnspr4-dev 但是它将不会被安装
E: 无法安装的软件包


接下来当我安装libnspr4-dev
代码:
open-baike@open-baike-desktop:~$ sudo apt-get install libnspr4-dev

问题包浮出水面:
下列的软件包有不能满足的依赖关系:
代码:
libnspr4-dev: 依赖: libnspr4-0d (<= 4.7.1+1.9-0ubuntu4.1~) 但是 4.7.2~b2-0ubuntu1~fta1~hardy 正要被安装
E: 无法安装的软件包


确定依赖的问题及解决思路:
看了上面的我还是有点搞不明白,没关系,打开新立得软件包管理器,对照一下,就好理解了,搜索关键字libnspr4-0d,得到结果如下图

点击查看

现 在好理解了,原来是由于gnome-devel最终依赖于libnspr4-0d (<= 4.7.1+1.9-0ubuntu4.1~) 要特别注意版本,可是已经安装了更新的版本同时发现,ubuntu8.10的源中已经没有了这个libnspr4-0d (<= 4.7.1+1.9-0ubuntu4.1~)文件,只有一个libnspr4-0d (4.7.2~b2-0ubuntu1~fta1~hardy)被安装。
在些之前我尝试卸载libnspr4-0d,发现连firfox,还 有整个桌面,gnome-panel都要被卸载。换个思路。
反正一定是需要有个libnspr4-0d (<= 4.7.1+1.9-0ubuntu4.1~)的文件。google很轻松地在ubuntu8.04找到这个文件,下载下来,看来只能手动通过 dpkg命令来安装了。
这里我玩了一个小花招,不让卸载,但是给它降版不就成了,回头让它自己更新。

完美解决

开始时我双击安装提示已经有了更新的版本,强制更新了只能,图形界面下办不到,第一反应想到了dpkg命令。
终端下执行(假定在下载的文件在桌面):
代码:
open-baike@open-baike-desktop:~/桌面$ sudo dpkg -i --ignore-depends=libnspr4-0d libnspr4-0d_4.7.1+1.9-0ubuntu0.8.04.5_i386.deb

下面的提示信息证明我的思路正确了:
代码:
dpkg - 警告:即将把 libnspr4-0d 从 4.7.2~b2-0ubuntu1~fta1~hardy 降级到 4.7.1+1.9-0ubuntu0.8.04.5。

成功替换后,重新安装gnome-devel,一切顺利。
讨厌的版本依赖问题终于解决了。

后记:这次解决的依赖问题是由于依赖的包版本和实际的版本不一致造成的。而且连编译环境安装不上。希望在这里写出来,一来少走些弯路,二来在出现问题能有解决的思路。
附:dpkg命令中文帮助信息,更多信息请参阅
用法:dpkg [<选项> ...] <命令>

代码:
命令:
-i|–install <.deb 文件名> … | -R|–recursive <目录> …
–unpack <.deb 文件名> … | -R|–recursive <目录> …
-A|–record-avail <.deb 文件名> … | -R|–recursive <目录> …
–configure <软件包名> … | -a|–pending
–triggers-only <软件包名> … | -a|–pending
-r|–remove <软件包名> … | -a|–pending
-P|–purge <软件包名> … | -a|–pending
–get-selections [<表达式> ...] 把已选中的软件包列表打印到标准输出。
–set-selections 从标准输入里读出要选择的软件。
–clear-selections 取消选中所有不必要的软件包。
–update-avail <软件包文件> 替换现有可安装的软件包信息。
–merge-avail <软件包文件> 把文件中的信息合并到系统中。
–clear-avail 清除现有的软件包信息。
–forget-old-unavail 忘却已被卸载的不可安装的软件包。
-s|–status <软件包名> … 显示软件包详尽的状态信息。
-p|–print-avail <软件包名> … 显示可供安装的版本详情。
-L|–listfiles <软件包名> … 列出所有“属于”该软件包(或多个)的文件。
-l|–list [<表达式> ... 简明地列出软件包的状态。
-S|--search <表达式> ... 搜寻拥有该文件(或多个文件)的包。
-C|--audit 检查搜寻残损的软件包。
--print-architecture 显示 dpkg 体系架构。
--compare-vesions <关系> 比较版本号 - 见下。
--force-help 显示本强制选项的帮助信息。
-Dh|--debug=help 显示有关出错调试的帮助信息。

-h|--help 显示本帮助信息。
--version 显示版本信息。
--license | --licence 显示版权和许可证条文。

对归档文件使用 dpkg -b|--build|-c|--contents|-e|--control|-I|--info|-f|--field|
-x|--extract|-X|--vextract|--fsys-tarfile (输入 dpkg-deb --help)。

供内部使用:dpkg --assert-support-predepends | --predep-package |
--assert-working-epoch | --assert-long-filenames | --assert-multi-conrep。

选项:
--admindir=<目录> 使用 <目录> 而非 /var/lib/dpkg。
--root=<目录> 安装到另一个根文件系统。
--instdir=<目录> 改变安装的根目录的同时保持管理(admin)目录不变。
-O|--selected-only 忽略没有被选中安装或升级的软件包。
-E|--skip-same-version 忽略版本与已安装软件版本相同的软件包。
-G|--refuse-downgrade 忽略版本早于已安装软件版本的的软件包。
-B|--auto-deconfigure 就算会影响其他软件包,也要安装。
--[no-]triggers 跳过或强制随之发生的触发器处理。
–no-debsig 不去试图验证软件包的签名。
–no-act|–dry-run|–simulate
仅仅报告我们要执行的操作 - 但是不执行。
-D|–debug=<八进制数字> 开启调试功能(参见 -Dhelp 或者 –debug=help)。
–status-fd 发送状态改变的更新信号到文件描述符。
–log=<文件名> 把状态的更动和操作信息记录到 <文件名>。
–ignore-depends=<软件包名>,…
忽略关于 <软件包名> 的所有依赖关系。
–force-… 忽视遇到的问题(参见 –force-help)。
–no-force-…|–refuse-…
当遇到问题时中止运行。
–abort-after 遇到个错误后终止。

可供–compare-version 使用的比较运算符有:
lt le eq ne ge gt (如果版本号为空,那么就认为它先于任意版本号);
lt-nl le-nl ge-nl gt-nl (如果版本号为空,那么就认为它后于任意版本号);
< << <= = >= >> > (仅仅是为了与主控文件的语法兼容)。



Ubuntu循环依赖(Cycle Dependency)的解决[免编译+解决步骤]
:
最近在VMware中安装了一个Ubuntu系统。由于创建系统时没有要求安装虚拟网卡,因此需要安装Ubuntu的软件包时,需要自己下载deb 文件,拖进系统,然后双击调用gdebi进行安装。可是,当我尝试安装G++时却出现了问题:g++-4.1这个包依赖libstdc++6-4.1- dev这个包(也就是C++库),而libstdc++6-4.1-dev又依赖g++-4.1。结果两个包都装不上。

上网搜索,在Ubuntu官方论坛找到了解决方法:

在命令行下执行以下语句
代码:
sudo dpkg -i –ignore-depends=libstdc++6-4.1-dev g++-4.1_4.1.2-0ubuntu4_i386.deb
sudo dpkg -i –ignore-depends=g++-4.1 libstdc++6-4.1-dev_4.1.2-0ubuntu4_i386.deb

即可。
(g++-4.1默认安装包名为g++-4.1_4.1.2-0ubuntu4_i386.deb;libstdc++6-4.1-dev默认安装包名为libstdc++6-4.1-dev_4.1.2-0ubuntu4_i386.deb)

也就是说,强行让两个安装包忽略依赖项。

使用apt-get自动安装应该没有这种问题。

附:dpkg命令中文帮助信息
用法:dpkg [<选项> ...] <命令>
命令:
代码:
-i|–install <.deb 文件名> … | -R|–recursive <目录> …
–unpack <.deb 文件名> … | -R|–recursive <目录> …
-A|–record-avail <.deb 文件名> … | -R|–recursive <目录> …
–configure <软件包名> … | -a|–pending
–triggers-only <软件包名> … | -a|–pending
-r|–remove <软件包名> … | -a|–pending
-P|–purge <软件包名> … | -a|–pending
–get-selections [<表达式> ...] 把已选中的软件包列表打印到标准输出。
–set-selections 从标准输入里读出要选择的软件。
–clear-selections 取消选中所有不必要的软件包。
–update-avail <软件包文件> 替换现有可安装的软件包信息。
–merge-avail <软件包文件> 把文件中的信息合并到系统中。
–clear-avail 清除现有的软件包信息。
–forget-old-unavail 忘却已被卸载的不可安装的软件包。
-s|–status <软件包名> … 显示软件包详尽的状态信息。
-p|–print-avail <软件包名> … 显示可供安装的版本详情。
-L|–listfiles <软件包名> … 列出所有“属于”该软件包(或多个)的文件。
-l|–list [<表达式> ... 简明地列出软件包的状态。
-S|--search <表达式> ... 搜寻拥有该文件(或多个文件)的包。
-C|--audit 检查搜寻残损的软件包。
--print-architecture 显示 dpkg 体系架构。
--compare-vesions <关系> 比较版本号 - 见下。
--force-help 显示本强制选项的帮助信息。
-Dh|--debug=help 显示有关出错调试的帮助信息。

-h|--help 显示本帮助信息。
--version 显示版本信息。
--license | --licence 显示版权和许可证条文。

对归档文件使用 dpkg -b|--build|-c|--contents|-e|--control|-I|--info|-f|--field|
-x|--extract|-X|--vextract|--fsys-tarfile (输入 dpkg-deb --help)。

供内部使用:dpkg --assert-support-predepends | --predep-package |
--assert-working-epoch | --assert-long-filenames | --assert-multi-conrep。

选项:
--admindir=<目录> 使用 <目录> 而非 /var/lib/dpkg。
--root=<目录> 安装到另一个根文件系统。
--instdir=<目录> 改变安装的根目录的同时保持管理(admin)目录不变。
-O|--selected-only 忽略没有被选中安装或升级的软件包。
-E|--skip-same-version 忽略版本与已安装软件版本相同的软件包。
-G|--refuse-downgrade 忽略版本早于已安装软件版本的的软件包。
-B|--auto-deconfigure 就算会影响其他软件包,也要安装。
--[no-]triggers 跳过或强制随之发生的触发器处理。
–no-debsig 不去试图验证软件包的签名。
–no-act|–dry-run|–simulate
仅仅报告我们要执行的操作 - 但是不执行。
-D|–debug=<八进制数字> 开启调试功能(参见 -Dhelp 或者 –debug=help)。
–status-fd 发送状态改变的更新信号到文件描述符。
–log=<文件名> 把状态的更动和操作信息记录到 <文件名>。
–ignore-depends=<软件包名>,…
忽略关于 <软件包名> 的所有依赖关系。
–force-… 忽视遇到的问题(参见 –force-help)。
–no-force-…|–refuse-…
当遇到问题时中止运行。
–abort-after 遇到个错误后终止。

可供–compare-version 使用的比较运算符有:
lt le eq ne ge gt (如果版本号为空,那么就认为它先于任意版本号);
lt-nl le-nl ge-nl gt-nl (如果版本号为空,那么就认为它后于任意版本号);
< << <= = >= >> > (仅仅是为了与主控文件的语法兼容)。

阅读(2086) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~