答案1
很容易意识到我们面临着库版本之间的兼容性问题。
我们拿一个有这个问题的环境来看看解决方案:
- 操作系统:Ubuntu 20.04(amd64)
- 软件:Vectr 0.1.15(矢量图形编辑器)
在这种情况下,当尝试打开它时,什么也没有发生,它没有打开,但也没有显示错误,只有当尝试从终端 ( ./vectr
) 启动 Vectr 时才会出现错误。
首先,我们来看看可能导致错误的依赖关系:
:~/Downloads/Vectr$ ldd vectr | grep pango
libpangocairo-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.0 (0x00007f4ab3581000)
libpango-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libpango-1.0.so.0 (0x00007f4ab33e7000)
libpangoft2-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.0 (0x00007f4ab1b3b000)
这可以通过不同的方式完成,只需询问 Google。
如果您想查看已安装的库的详细信息,可以使用下一个命令。请注意,第二列表示版本:
:~/Downloads/Vectr$ dpkg -l | grep libpango
ii libpango-1.0-0:amd64 1.44.7-2ubuntu4 amd64 Layout and rendering of internationalized text
ii libpango-1.0-0:i386 1.44.7-2ubuntu4 i386 Layout and rendering of internationalized text
ii libpangocairo-1.0-0:amd64 1.44.7-2ubuntu4 amd64 Layout and rendering of internationalized text
ii libpangocairo-1.0-0:i386 1.44.7-2ubuntu4 i386 Layout and rendering of internationalized text
ii libpangoft2-1.0-0:amd64 1.44.7-2ubuntu4 amd64 Layout and rendering of internationalized text
ii libpangoft2-1.0-0:i386 1.44.7-2ubuntu4 i386 Layout and rendering of internationalized text
第一个解决方案
由于该错误仅影响一个软件,因此我认为降级系统上安装的库并不方便(第二种解决方案),这可能会影响其他软件。
因此,此解决方案包括将库(旧版本)复制到软件所在文件夹的根目录,在我的情况下,它是可移植的,并且我将其放在Downloads/Vectr
.
我们已经看到了确切的依赖项,我们将手动下载它们(选择您的架构并下载 .deb):
正如我们之前看到的,我的架构是 amd64,但是,系统还安装了 i386 版本的库。由于此过程是手动的且可移植,因此我决定仅使用 amd64,并且它对我有用。但如果出现任何错误,请尝试同时使用两种架构。
打开 .deb 文件档案管理员,然后打开data.tar.xz
文件,然后将这/./usr/lib/x86_64-linux-gnu/
两个文件解压到软件的根文件夹(Downloads/Vectr
)中。对每个下载的 .deb 文件重复此操作。
您还可以使用阿尔来自 apit 包二进制工具提取 deb 文件的命令:
# Set $lib_name and $deb_file_path according to your arch, such as:
lib_name="libpangocairo-1.0"
deb_file_path="libpango-1.0-0_1.44.7-2ubuntu4_amd64.deb"
cd /home/myuser/DownloadsVects
mkdir $lib_name
cd $lib_name
ar x ~/Downloads/$deb_file_path
tar xf data.tar.xz
cp ls usr/lib/x86_64-linux-gnu/libpango-1.0.so.0 ..
# Also repeat for each file
之后软件应该可以正常运行。如果你运行:
:~/Downloads/Vectr$ ldd vectr | grep pango
libpangocairo-1.0.so.0 => /home/myuser/Downloads/Vectr/./libpangocairo-1.0.so.0 (0x00007fc6b0ac8000)
libpango-1.0.so.0 => /home/myuser/Downloads/Vectr/./libpango-1.0.so.0 (0x00007fc6b0931000)
libpangoft2-1.0.so.0 => /home/myuser/Downloads/Vectr/./libpangoft2-1.0.so.0 (0x00007fc6af084000)
您将看到依赖项的地址如何从/usr/lib/x86_64-linux-gnu/
变为/home/myuser/Downloads/Vectr/
。
第二种解决方案
降级这些库(请记住,此方法可能会导致其他软件出现故障)。
变体一:(我无法尝试这个)
从源中拥有的存储库安装旧版本。
列出库的可用版本:
:~$ apt-cache madison libpango-1.0-0
libpango-1.0-0 | 1.44.7-2ubuntu4 | http://archive.ubuntu.com/ubuntu focal/main amd64 Packages
就我而言,我只有当前版本,并且它是导致冲突的版本。如果您获得其他版本,可以使用以下命令降级:
:~$ sudo apt install pkg-name=old-version
请记住,还必须安装两个库(libpangocairo-1.0-0 和 libpangoft2-1.0-0)。我不知道这些是否会作为依赖项自动安装,这个疑问对于 i386 的版本也有效。
变体二:(我确实尝试过这个)
对于没有以前版本的用户,您必须按照以下说明下载它 (.deb)第一个解决方案。为了避免重大错误,还必须下载 i386 的版本(请记住,在本例中我们有 UbuntuAMD64)。
下载文件后,在保存文件的文件夹中打开终端,然后可以使用以下命令降级:
:~$ sudo dpkg -i libpango*.deb
这可能会以错误结束,但最终软件运行良好,并且显然一切正常。未来的后果我还不知道。
到撤消这次降级运行的sudo apt update
话,sudo apt upgrade
你肯定会需要一个sudo apt --fix-broken install
。
然后,如果您想让更改永久生效,并避免意外更新这些库,您可以使用以下命令:
:~$ sudo apt-mark hold package-name
这可以防止在系统升级期间自动安装、更新、升级或删除库。您可以使用以下命令撤消它:
:~$ sudo apt-mark unhold package-name