尽管存在符号链接,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 版本,将其解压缩,挖掘直到找到libshareinclude 文件夹,并将这些文件夹复制到/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 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 不打印任何内容。

【问题讨论】:

是否在链接时添加了选项-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 仍无法加载库的主要内容,如果未能解决你的问题,请参考以下文章

即使符号存在于 .so 文件中也无法加载符号? [复制]

请问,ld链接生成的时候,加载动态库/静态库顺序如何?

ubuntu/Linux下cannot find lib....so.x 无法找到动态链接库

LD_PRELOAD加载动态库

LD_PRELOAD加载动态库

FileNotFoundException:“无法加载文件或程序集”尽管程序集存在 [关闭]