我安装了 bind-tools,这是 dnsutils 的 Arch linux 替代品,但没有一个工具可以工作,都失败并出现错误:
host: error while loading shared libraries: libidn2.so.4: cannot open shared object files: No such file or directory
libidn2.so.4 的这个问题似乎是 Arch 包构建的最近问题(2019 年 1 月),并且显然产生了一些非常可怕的结果,比如使整个系统无法启动。
我的问题是:(1)等到bind-tools的维护者修复这个问题,还是自己尝试修复它是正确的方法吗?(2)到底发生了什么?bind-tools 需要 libidn2.so.4 但不安装?维护者怎么可能犯这样的错误?
我不运行 Arch Linux,所以我在这方面有点冒险。
您链接到的文章表明它是缺少符号链接,而不是缺少包。这是有道理的,因为通常在 Linux 中,共享库在“.so”之后至少有两个八位字节的版本号,而错误只提到一个。
我的建议是你跑
看看它会返回什么。如果它只是返回
并且没有提到更具体的内容,那么我建议运行
我建议同时运行两者,因为您的程序似乎正在寻找该库的主要版本 4,但您引用的文章正在寻找主要版本 0。此修复基本上为文件 /usr/lib/libidn2.so 设置了两个别名,一个为 .0,一个为 .4。
如果您看到有一个 /usr/lib/libidn2.so.something.something,并且 /usr/lib/libidn2.so 是它的符号链接,则符号链接到更具体的文件可能更有意义。我真的不知道哪种方式一定是最好的。
您的另一种选择是将您的 libidn2 降级到此问题之前的版本。
至于这是怎么发生的——看起来 Arch Linux 的 libidn2 的维护者犯了一个错误。让我感到困惑的不是这一切都发生了,而是……那个错误是在 12 天前添加的。可以通过一些手动符号链接修复的错误应该需要数小时而不是数周才能修复。我并不是要贬低 Arch Linux 的维护者。我不知道他们那边发生了什么。只是……令人沮丧。我的猜测是,这只是这个故事的冰山一角。无论如何,人就是人,我们都会犯错。有人可能已经为此自责了,他们不需要我们的帮助。
由于这是 Arch Linux 中经常出现的那种错误,我编写了一个专门的脚本来分析包并确定它们是否正确构建。(在 95% 的情况下,Arch Linux 软件包是正确构建的):https ://github.com/eli-schwartz/dotfiles/blob/master/bin/pkg-list-linked-libraries
在 bind-tools 包上运行它并查找 libidn2 表明最新版本的 bind-tools 链接到 libidn.so.4:
那个库是从哪里来的?
Arch 中的 bind-tools 包需要 libidn2 包作为依赖项,根据 的输出
pacman -Si bind-tools
,这很好,因为它依赖于它。在撰写本文时,官方 Arch Linux 存储库中的两个包的版本对应于我在上面检查过的 bind-tools 和 libidn2 的版本:
因此,您显然已经安装了最新版本的 bind-tools。但是您声称您没有二进制文件所需的 libidn2 库。为什么不?您当前安装的 libidn2 版本是什么?检查 的输出
pacman -Q libidn2
。由于该软件包适用于成千上万的其他人,我的结论是您的系统已损坏,您需要正确更新系统才能安装最新版本的 libidn2。请参阅https://wiki.archlinux.org/index.php/System_maintenance#Partial_upgrades_are_unsupported详细了解为什么会发生这种情况、如何正确修复它以及为什么符号链接不仅不是解决方案,甚至会破坏您的系统更远。
至于抛物线错误,这是完全相反的问题。一个完全不同的 Linux 发行版(不是Arch Linux)无法使用新的 libidn2 重建其软件包,结果这些软件包错误地链接到 libidn2.so.0
如果你真的遇到了 Parabola 错误,那么你根本就没有使用 Arch Linux,你需要说明你实际上是在使用 Parabola,否则人们将不知道如何帮助你。