Pango-ERROR Harfbuzz 版本太旧

ale*_*lex 18 linux ubuntu kali-linux

谷歌搜索,我看到这个错误发生在使用 Pango 库的不同软件上。Pango是一个文本布局引擎库,它与 HarfBuzz 整形引擎一起工作以显示多语言文本。

如果该软件是命令行工具,或者是从终端启动,则错误如下所示:

:~$ sudo ah

(ah:2782): Pango-ERROR **: 16:54:45.844: Harfbuzz version too old (1.3.1)

Trace/breakpoint trap
:~$
Run Code Online (Sandbox Code Playgroud)

如何修复此错误?

提前致谢

小智 5

很容易意识到我们面临着库版本之间的兼容性问题。

我们拿一个有这个问题的环境来看看解决方案:

  • 操作系统: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)
Run Code Online (Sandbox Code Playgroud)

这可以通过不同的方式完成,只需询问 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
Run Code Online (Sandbox Code Playgroud)

第一个解决方案

由于该错误仅影响一个软件,因此我认为降级系统上安装的库并不方便(第二种解决方案,这可能会影响其他软件。

因此,此解决方案包括将库(旧版本)复制到软件所在文件夹的根目录,在我的情况下,它是可移植的,并且我将其放在Downloads/Vectr.

我们已经看到了确切的依赖项,我们将手动下载它们(选择您的架构并下载 .deb):

正如我们之前看到的,我的架构是 amd64,但是,系统还安装了 i386 版本的库。由于此过程是手动的且可移植,因此我决定仅使用 amd64,并且它对我有用。但如果出现任何错误,请尝试同时使用两种架构。

使用Archive Manager打开 .deb ,然后打开data.tar.xz文件,然后转到/./usr/lib/x86_64-linux-gnu/软件根文件夹 ( Downloads/Vectr) 中并将这两个文件解压。对每个下载的 .deb 文件重复此操作

您还可以使用apit package binutils命令中的ar来提取 deb 文件:

:~/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)
Run Code Online (Sandbox Code Playgroud)

之后软件应该可以正常运行。如果你运行:

:~/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)
Run Code Online (Sandbox Code Playgroud)

您将看到依赖项的地址如何从/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
Run Code Online (Sandbox Code Playgroud)

就我而言,我只有当前版本,并且它是导致冲突的版本。如果您获得其他版本,可以使用以下命令降级:

:~$ sudo apt install pkg-name=old-version
Run Code Online (Sandbox Code Playgroud)

请记住,还必须安装两个库(libpangocairo-1.0-0 和 libpangoft2-1.0-0)。我不知道这些是否会作为依赖项自动安装,这个疑问对于 i386 的版本也有效。

变体二:(我确实尝试过这个)

对于没有以前版本的用户,您必须按照第一个解决方案中的指示下载它 (.deb) 。为了避免重大错误,还必须下载 i386 的版本(请记住,在本例中我们有 Ubuntu amd64)。

下载文件后,在保存文件的文件夹中打开终端,然后可以使用以下命令降级:

:~$ sudo dpkg -i libpango*.deb
Run Code Online (Sandbox Code Playgroud)

这可能会以错误结束,但最终软件运行良好,并且显然一切正常。未来的后果我还不知道。

撤消此降级运行sudo apt update,那么sudo apt upgrade您肯定需要一个sudo apt --fix-broken install.

然后,如果您想让更改永久生效,并避免意外更新这些库,您可以使用以下命令:

:~$ sudo apt-mark hold package-name
Run Code Online (Sandbox Code Playgroud)

这可以防止在系统升级期间自动安装、更新、升级或删除库。您可以使用以下命令撤消它:

:~$ sudo apt-mark unhold package-name
Run Code Online (Sandbox Code Playgroud)