如何解决包冲突?

如何解决包冲突?

为了运行某些软件,我想同时安装这两个软件包libsigc++-2.0-0c2alibsigc++-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)

错误来源:dpkg 错误:“尝试覆盖文件,该文件也在……”

由于它们被编译为同一版本,因此无法将它们放在一起,手动更改名称也无济于事。存储库中的工具已编译为可使用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)

指示:

  1. 创建一个文件夹来包含外部共享库(您无法安装的其他版本),例如:

    mkdir ~/Desktop/sand_box/local_so_lib_test
    
  2. 从包中提取库

    $ 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
    
  3. 通过设置启动特殊依赖工具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

相关内容