为了运行某些软件,我想同时安装这两个软件包libsigc++-2.0-0c2a
。libsigc++-2.0-0v5
然而,显然这些方案存在冲突,
sudo apt-get install libsigc++-2.0-0v5 libsigc++-2.0-0c2a
结果是
The following packages have unmet dependencies.
libsigc++-2.0-0v5 : Conflicts: libsigc++-2.0-0c2a but 2.2.10-0.2ubuntu2 is to be installed
E: Unable to correct problems, you have held broken packages.
有没有一种通用的策略来应对这种情况?难道不应该是“版本编号“解决方案在这里适用吗?
答案1
问题
我同意 MichaelW 的观点,它包含相同的 lib 文件和相同的版本。但是,您收到的错误与此无关,而是在其中一个包中声明了包版本冲突:
$ dpkg --info Downloads/libsigc++-2.0-0v5_2.4.1-2_amd64.deb
...
Conflicts: libsigc++-2.0-0c2a
Replaces: libsigc++-2.0-0c2a
...
如果删除这些行,我们会得到与相同文件覆盖相关的错误,类似于这个:
Unpacking libjline-java (from .../libjline-java_1.0-1_all.deb) ...
dpkg: error processing /var/cache/apt/archives/libjline-java_1.0-1_all.deb (--unpack):
trying to overwrite '/usr/share/java/jline.jar', which is also in package scala 2.9.2-400
Errors were encountered while processing:
/var/cache/apt/archives/libjline-java_1.0-1_all.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
由于它们被编译为同一版本,因此无法将它们放在一起,手动更改名称也无济于事。存储库中的工具已编译为可使用libsigc-2.0.so.0
。
解决方案
这是一个带有测试用例的简单解决方案。
测试用例:
我使用以下命令查找依赖于相同库的包:
$ apt-cache rdepends libsigc++-2.0-0v5
...
libatkmm-1.6-1v5
inkscape
gparted
gnome-system-monitor
aptitude
使用以下命令验证所包含的二进制文件确实依赖于它:
$ dpkg -L gnome-system-monitor | grep /bin/
/usr/bin/gnome-system-monitor
$ ldd `which gnome-system-monitor` | grep libsigc
libsigc-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libsigc-2.0.so.0 (0x00007f9491bec000)
指示:
创建一个文件夹来包含外部共享库(您无法安装的其他版本),例如:
mkdir ~/Desktop/sand_box/local_so_lib_test
从包中提取库
$ dpkg-deb --extract ~/Downloads/libsigc++-2.0-0c2a_2.2.10-0ubuntu2_amd64.deb /tmp/libsigc $ cp -a /tmp/libsigc/usr/lib/x86_64-linux-gnu/* ~/Desktop/sand_box/local_so_lib_test $ ls -l total 20 lrwxrwxrwx 1 sneetsher sneetsher 20 Dec 12 2011 libsigc-2.0.so.0 -> libsigc-2.0.so.0.0.0 -rw-r--r-- 1 sneetsher sneetsher 18488 Dec 12 2011 libsigc-2.0.so.0.0.0
通过设置启动特殊依赖工具
LD_LIBRARY_PATH
$ LD_LIBRARY_PATH=~/Desktop/sand_box/local_so_lib_test gnome-system-monitor
查看:
$ LD_LIBRARY_PATH=~/Desktop/sand_box/local_so_lib_test ldd /usr/bin/gnome-system-monitor | grep libsigc
libsigc-2.0.so.0 => /home/sneetsher/Desktop/sand_box/local_so_lib_test/libsigc-2.0.so.0 (0x00007fabbe960000)
$ LD_LIBRARY_PATH=~/Desktop/sand_box/local_so_lib_test gnome-system-monitor &
$ lsof -c "gnome-system-mo" | grep libsigc
gnome-sys 28655 sneetsher mem REG 8,5 18488 2752572 /home/sneetsher/Desktop/sand_box/local_so_lib_test/libsigc-2.0.so.0.0.0
答案2
两个包都包含相同的文件:
- /usr/lib/x86_64-linux-gnu/libsigc-2.0.so.0
- /usr/lib/x86_64-linux-gnu/libsigc-2.0.so.0.0.0
您可以在 Ubuntu 软件包中的软件包详细信息搜索中找到它:http://packages.ubuntu.com/
例如 http://packages.ubuntu.com/wily/amd64/libsigc++-2.0-0v5/filelist http://packages.ubuntu.com/precise/amd64/libsigc++-2.0-0c2a/filelist
所以冲突是由软件包中的相同文件引起的。系统现在该怎么办?由于无法决定,因此它会显示冲突。
答案3
尝试sudo apt-get build-dep libsigc++-2.0-0v5 libsigc++-2.0-0c2a