加载共享库时出错;无法打开共享对象文件:没有这样的文件或目录。

程序“evince”抱怨找不到libfreetype.so.6;然而,我明明有这个文件,并且已经包含在我的LD_LIBRARY_PATH中;此外,我还有另一个使用libfreetype6的程序,它能够正常运行。这里发生了什么事?
jbud@jb-pc ~> evince
evince: error while loading shared libraries: libfreetype.so.6: cannot open shared object file: No such file or directory

jbud@jb-pc ~> ldd /usr/bin/evince | grep freetype
libfreetype.so.6 => /usr/local/lib/libfreetype.so.6 (0x00007f912179d000)

jbud@jb-pc ~> file /usr/local/lib/libfreetype.so.6
/usr/local/lib/libfreetype.so.6: symbolic link to `libfreetype.so.6.11.1'

jbud@jb-pc ~> file /usr/local/lib/libfreetype.so.6.11.1
/usr/local/lib/libfreetype.so.6.11.1: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x21a4b8005e0c9a42af001b35fb984f4e25efc71c, not stripped

jbud@jb-pc ~> echo $LD_LIBRARY_PATH
/usr/lib/:/usr/lib64/:/usr/lib/x86_64-linux-gnu/:/usr/local/lib/

jbud@jb-pc ~> ldd jdrive/jstuff/work/personal/noengine/client | grep freetype
libfreetype.so.6 => /usr/local/lib/libfreetype.so.6 (0x00007feb5ac89000)
2个回答

在64位Linux发行版上,如果错误是由32位应用程序引发的,则不应创建对/usr/lib/libfreetype.so.6的符号链接。这可能会导致库文件处于“损坏”状态。
在64位系统上,您需要安装必要的32位依赖项以支持您的32位应用程序,以便它能够检测和使用已经存在的libfreetype.so.6。具体所需的依赖项因应用程序而异,但通常缺少以下内容:
sudo apt-get install libgtk2.0-0:i386 libidn11:i386 libglu1-mesa:i386

这些也可能解决问题:
sudo apt-get install libpangox-1.0-0:i386 libpangoxft-1.0-0:i386

致敬, 阿尔伯特·科克

我能够解决这个问题,但是我仍然不完全确定为什么一开始会出现这个问题。
在运行strace之后,我看到了open("/usr/local/lib/libfreetype.so.6", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied),这有点说不通,因为其他依赖于libfreetype的程序(没有sudo权限)都能够正常运行,并且权限已经设置为所有人可读/写,即使在sudo下运行evince也没有帮助。
我的libfreetype的apt-get将库文件放在了/usr/lib/x86_64-linux-gnu/libfreetype.so.6,但由于某种原因,evince没有检查那个文件夹(尽管它已经添加到了LD_LIBRARY_PATH)。然而,我创建了一个符号链接到它检查的文件夹:sudo ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so.6.10.1 /usr/lib/libfreetype.so.6,现在evince可以正常运行了。