ldconfig 错误:使用 Linux 加载程序时“不是符号链接”

问题描述 投票:0回答:7

跑步时:

    sudo /sbin/ldconfig

出现以下错误:

    /sbin/ldconfig: /usr/local/lib/ is not a symbolic link

当我运行

file
命令时,会出现以下内容:

    file /usr/local/lib/
    /usr/local/lib/: directory

内部

/usr/local/lib/
有我使用的三个库。我在这里将它们称为
lib1
lib2
lib3

现在,当我对二进制文件执行

ldd
时,结果是:

    lib1.so => not found
    lib2.so => not found
    lib3.so => /usr/local/lib/lib3.so (0x00216000)

但它们都与

/usr/local/lib/{lib1,lib2,lib3}.so
在同一个文件夹中。

每次运行

ldconfig
时,都会出现同样的错误:

/usr/local/lib/ is not a symbolic link

我认为

/usr/local/lib
应该在
/etc/ld.conf.d/*.conf
中声明两次,但不是:

    sudo egrep '\/usr\/local' /etc/ld.so.conf.d/*
    projectA.conf.old:/usr/local/projectA/lib
    local.conf:/usr/local/lib

ld.so.conf
只包含
/etc/ld.so.conf.d/*.conf
,所以这个
*.old
不做处理,它指的是
/usr/local/projectA/lib

经过一段时间的尝试,我删除了所有 lib1 和 lib2 (在某些时候我在二进制文件的文件夹上测试了它),出现了同样的错误。

linux linker makefile gnu-make
7个回答
58
投票

我在 Oracle 11R2 客户端上遇到了这个问题。不确定是 Oracle 安装程序这样做了还是有人在我到达之前在这里这样做了。不是 64 位 vs 32 位,都是 64 位。

错误是

libexpat.so.1
不是符号链接。

原来有两个相同的文件,

libexpat.so.1.5.2
libexpat.so.1
。删除有问题的文件并使其成为 1.5.2 版本的符号链接会导致错误消失。

您希望众所周知的名称成为当前版本的符号链接是有道理的。如果你这样做,你就不太可能得到一个过时的库。


9
投票

我只是运行了以下命令:

export LD_LIBRARY_PATH=/usr/lib/

现在一切正常。


7
投票

解决了,至少在问题点上。

问之前在网上查了一下,没有确凿的解决方案,这个错误的原因是:lib1.so和lib2.so不OK,很可能不是为64位PC编译的,而是为32位编译的机器否则 lib3.so 是一个 64 位 lib。至少这是我的假设。

非常不幸的是

ldconfig
没有给出明确的错误消息,通知它无法加载库,它只泵:

ldconfig:/folder_where_the_wicked_lib_is/ 不是符号链接

当我删除二进制文件中

ldd
找不到的库时,我解决了这个问题。现在我更容易知道问题出在哪里了。

我的ld版本: GNU ld 版本 2.20.51,我不知道最新版本是否为其用户提供了更好的信息。

谢谢。


4
投票

您需要在 /etc/ld.so.conf 中包含库的路径,然后重新运行 ldconfig 来更新列表

另一种可能性是在环境变量 LD_LIBRARY_PATH 中包含库的路径,然后重新运行可执行文件。

检查符号链接是否指向有效的库...

可以直接在/etc/ld.so.conf中添加路径,无需include...

运行

ldconfig -p
查看您的库是否已很好地包含在缓存中。


3
投票

我也遇到同样的问题, 其解决方案是: 您收到错误的文件可能是实际文件与另一个版本的重复文件。因此,只需删除引发错误的特定文件即可解决问题。


0
投票

在 shell 中简单运行: sudo apt-get install --reinstall libexpat1
libxcb 遇到同样的问题 - 以这种方式解决 - 非常快:)


0
投票

通常使用版本。例如,您可以拥有

lib1.so.1
,这是您的实际库,具有次要版本(也可以是像
*.so.1.1
这样的补丁版本)。然后应该有一个指向您的次要(或补丁)版本的“主要”符号链接。喜欢
sudo ln -s /usr/local/lib/lib1.so.1 /usr/local/lib1.so

如果您有某个库的补丁版本

libsomething.so.1.3
,那么您的主要和次要符号链接展位应指向补丁版本。虽然您可以创建像
major
->
minor
->
patch
这样的符号链接链,但“专家”通常不喜欢它。这只是“意见”。请记住这一点。

/usr/local/lib
通常用于 custom 32 位库,
/usr/local/lib64
用于 custom 64 位库。

custom 是您自己开发的库或您显式(手动)安装在系统上的库。

要知道您使用的是什么架构库

file /usr/local/lib/lib1.so.1
。它会告诉你它是 32 位还是 64 位。因此,您将库移动到适当的目录中。

默认情况下,

/usr/local/lib
目录通常不会被
ldconfig
缓存(包含)。您还必须“教导”
ldconfig
在这些路径中缓存库。

为此,您需要编辑

/etc/ld.so.conf
文件并添加类似
include ld.so.conf.d/*.conf
的行(相对路径)。这有效地告诉
ldconfig
/etc/ld.so.conf.d/
目录加载其他配置文件。

然后您可以根据需要在

ldconfig
中创建任意数量的
/etc/ld.so.conf.d/
配置文件,但好的开始可能是
/etc/ld.so.conf.d/extra.conf

在此文件中,您可以告诉

ldconfig
应缓存(包括)哪些其他路径。在我们的例子中,只需添加 2 行 -
/usr/local/lib
/usr/local/lib64

完成这一切后,您只需使用

sudo ldconfig
更新共享库缓存即可。

当您想要加载某些特定库时,使用

LD_LIBRARY_PATH
环境变量主要是“仅开发工具”。通常您不应该使用/设置它。

© www.soinside.com 2019 - 2024. All rights reserved.