尽管存在符号链接,ld 仍无法加载库
Posted
技术标签:
【中文标题】尽管存在符号链接,ld 仍无法加载库【英文标题】:ld cannot load library despite symlink existing 【发布时间】:2017-10-16 08:51:51 【问题描述】:我正在尝试编译一个需要 SFML 2.41+ 的程序。 Ubuntu 16.04 的存储库没有足够新的版本,所以我按照this page 上的(有些稀疏的)说明安装了 SFML 2.4.2。具体来说,我从this page 下载了Linux 版本,将其解压缩,挖掘直到找到lib
、share
和include
文件夹,并将这些文件夹复制到/usr/local/
中的同名文件夹上。
运行包含的 Makefile 时出现以下错误:
/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
所以我似乎有一个符号链接到 .so
正在查找的路径中的 .so
文件。
为什么加载不了库?
(我最初担心双斜线,但this question 表示这些都可以。)
到目前为止我已经尝试过什么
我现在尝试运行 sudo ldconfig
和 sudo 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
不打印任何内容。
【问题讨论】:
您是否在链接时添加了选项-L/usr/local/lib
?大多数 Linux 系统的标准库搜索路径中没有 /usr/local/lib
。
第二个输出块包含attempt to open //usr/local/lib/libsfml-system.so failed
,所以无论出于何种原因,我的系统似乎都在那里搜索。
@Someprogrammerdude 只是因为没有其他工作,我尝试运行ld -L/usr/local/lib -lsfml-system --verbose
,但得到的结果与上述相同。
尝试运行strace ld -lsfml-system --verbose
,看看是否有任何提示“尝试打开”失败的原因。
路径/usr/local/lib/libsfml-system.so
的所有单独部分都需要被所有人读取。如果例如/usr/local/lib
目录不是所有人都可以读取的,那么您将遇到这样的错误。或库文件本身。我猜由于您的“安装”方法(只是复制目录),您可能已经更改了默认权限。
【参考方案1】:
问题原来是我的/usr/local/lib/
上的权限在我将文件复制到它们上时发生了变化。具体来说,执行位似乎未设置。再次设置后,我现在可以正确链接这些库了!
【讨论】:
【参考方案2】:标准 Linux 库缓存在 /etc/ld.so.cache
中。如果将库添加到标准路径,还需要运行(以 root 身份)ldconfig
。
【讨论】:
我已经试过了。好像什么都没做。我在问题中添加了一些输出。以上是关于尽管存在符号链接,ld 仍无法加载库的主要内容,如果未能解决你的问题,请参考以下文章