尽管存在符号链接,但 ld 无法加载库



我正在尝试编译一个需要SFML 2.41+的程序。Ubuntu 16.04 的存储库没有足够新的版本,所以我按照此页面上的(有点稀疏的)说明安装了 SFML 2.4.2。具体来说,我从此页面下载了Linux版本,提取了它,向下挖掘,直到我找到了libshareinclude文件夹,并将这些文件夹复制到/usr/local/中同名的文件夹中。

运行包含的生成文件时,出现以下错误:

/usr/bin/ld: cannot find -lsfml-system
/usr/bin/ld: cannot find -lsfml-window
/usr/bin/ld: cannot find -lsfml-graphics

目前专注于sfml-system,如果我运行ld -lsfml-system --verbose | grep /usr/local/lib我会得到以下内容:

attempt to open //usr/local/lib/x86_64-linux-gnu/libsfml-system.so failed
attempt to open //usr/local/lib/x86_64-linux-gnu/libsfml-system.a failed
attempt to open //usr/local/lib/libsfml-system.so failed
attempt to open //usr/local/lib/libsfml-system.a failed

如果我运行sudo ls -l /usr/local/lib | grep libsfml-system.so我会得到以下内容:

lrwxrwxrwx  1 root   root        21 Oct 16 01:38 libsfml-system.so -> libsfml-system.so.2.4
lrwxrwxrwx  1 root   root        23 Oct 16 01:38 libsfml-system.so.2.4 -> libsfml-system.so.2.4.2
-rw-r--r--  1 root   root     72080 Feb 10  2017 libsfml-system.so.2.4.2

所以我似乎有一个指向ld正在查找的路径中的.so文件的符号链接。 为什么它不能加载库?

(我最初担心双斜杠,但这个问题表明这些是可以的。


到目前为止我尝试过什么

我现在尝试运行sudo ldconfigsudo ldconfig /usr/local/lib/.这些都没有改变ld -lsfml-system的行为

特别是当我运行sudo ldconfig --verbose 2> /dev/null | grep sfml时,我得到

libsfml-window.so.2.4 -> libsfml-window.so.2.4.2
libsfml-graphics.so.2.4 -> libsfml-graphics.so.2.4.2
libsfml-audio-d.so.2.4 -> libsfml-audio-d.so.2.4.2
libsfml-graphics-d.so.2.4 -> libsfml-graphics-d.so.2.4.2
libsfml-audio.so.2.4 -> libsfml-audio.so.2.4.2
libsfml-window-d.so.2.4 -> libsfml-window-d.so.2.4.2
libsfml-system.so.2.4 -> libsfml-system.so.2.4.2
libsfml-system-d.so.2.4 -> libsfml-system-d.so.2.4.2
libsfml-network-d.so.2.4 -> libsfml-network-d.so.2.4.2
libsfml-network.so.2.4 -> libsfml-network.so.2.4.2
libsfml-network.so.2.3 -> libsfml-network.so.2.3.2
libsfml-graphics.so.2.3 -> libsfml-graphics.so.2.3.2
libsfml-system.so.2.3 -> libsfml-system.so.2.3.2
libsfml-window.so.2.3 -> libsfml-window.so.2.3.2

(在stderr我只收到似乎只是信息性的消息,例如:

/sbin/ldconfig.real: Path `/usr/local/lib' given more than once

/sbin/ldconfig.real: /lib/i386-linux-gnu/ld-2.23.so is the dynamic linker, ignoring

所以我认为它们并不重要。


由于提到了/etc/ld.so.cache,我用cp /etc/ld.so.cache /etc/ld.so.cache.bak制作了它的副本并重新运行了sudo ldconfig。生成了一个新的缓存文件,但它没有任何不同,即diff /etc/ld.so.cache /etc/ld.so.cache.bak不打印任何内容。

事实证明,当我将文件复制到它们上时,/usr/local/lib/的权限发生了变化。具体来说,执行位似乎尚未设置。再次设置后,我现在可以正确链接这些库了!

标准 Linux 库缓存在/etc/ld.so.cache中。如果将库添加到标准路径,则还需要运行(以 root 身份)ldconfig

最新更新