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

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

问题描述:

我想编译一个需要SFML 2.41+的程序。 Ubuntu 16.04的回购版没有足够新的版本,所以我通过遵循this page(有点稀疏)的说明安装了SFML 2.4.2。具体来说,我将Linux版本从this page下载,解压缩,直到找到lib,shareinclude文件夹,并将这些文件夹复制到/usr/local/中相同名称的文件夹上。尽管符号链接存在,但ld无法加载库

当运行包含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文件的路径ld正在寻找。 为什么不能加载库?

(我最初关注的双斜线,但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 

and

/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不打印任何内容。

+0

你*在链接时添加了“-L/usr/local/lib”选项吗?大多数Linux系统在标准库搜索路径中没有'/ usr/local/lib'。 –

+0

输出的第二个块包含'试图打开//usr/local/lib/libsfml-system.so失败',因为任何原因我的系统似乎在那里搜索。 – Ryan1729

+0

@Someprogrammerdude只是因为没有别的工作,我试着运行'ld -L/usr/local/lib -lsfml-system --verbose',但是我得到了和上面相同的结果。 – Ryan1729

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

+0

我现在试过了。似乎没有做任何事情。我在问题中添加了一些输出。 – Ryan1729

问题原来是当我将文件复制到他们上时,我的/usr/local/lib/上的权限发生了变化。具体来说,执行位似乎没有设置。再次设置这些之后,我现在可以正确链接这些库了!