免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1636 | 回复: 0
打印 上一主题 下一主题

Ubuntu的软件依赖分析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-04 18:48 |只看该作者 |倒序浏览
问题回放:这一次的升级由于一次错误的操作,就是换了ubuntu 8.10 软件源后,升级之前没有做必要的更新。(请参照,旧贴:
http://forum.ubuntu.org.cn/viewtopic.php?f=48&t=160722
通过网络升级安装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 (
确定依赖的问题及解决思路:
看了上面的我还是有点搞不明白,没关系,打开新立得软件包管理器,对照一下,就好理解了,搜索关键字libnspr4-0d,得到结果如下图
http://seo-dic.com.cn/wp-content/uploads/2008/10/2008-10-30-225223_807x118_scrot.png
点击查看

在好理解了,原来是由于gnome-devel最终依赖于libnspr4-0d (代码: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  … | -R|–recursive  …
–unpack  … | -R|–recursive  …
-A|–record-avail  … | -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)的解决[免编译+解决步骤]
:
http://seo-dic.com.cn/archives/1886
最近在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  … | -R|–recursive  …
–unpack  … | -R|–recursive  …
-A|–record-avail  … | -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 (如果版本号为空,那么就认为它后于任意版本号);
= >> > (仅仅是为了与主控文件的语法兼容)。
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/102400/showart_2045734.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP