跑步时:
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 (在某些时候我在二进制文件的文件夹上测试了它),出现了同样的错误。
我在 Oracle 11R2 客户端上遇到了这个问题。不确定是 Oracle 安装程序这样做了还是有人在我到达之前在这里这样做了。不是 64 位 vs 32 位,都是 64 位。
错误是
libexpat.so.1
不是符号链接。
原来有两个相同的文件,
libexpat.so.1.5.2
和libexpat.so.1
。删除有问题的文件并使其成为 1.5.2 版本的符号链接会导致错误消失。
您希望众所周知的名称成为当前版本的符号链接是有道理的。如果你这样做,你就不太可能得到一个过时的库。
我只是运行了以下命令:
export LD_LIBRARY_PATH=/usr/lib/
现在一切正常。
解决了,至少在问题点上。
问之前在网上查了一下,没有确凿的解决方案,这个错误的原因是: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,我不知道最新版本是否为其用户提供了更好的信息。
谢谢。
您需要在 /etc/ld.so.conf 中包含库的路径,然后重新运行 ldconfig 来更新列表
另一种可能性是在环境变量 LD_LIBRARY_PATH 中包含库的路径,然后重新运行可执行文件。
检查符号链接是否指向有效的库...
可以直接在/etc/ld.so.conf中添加路径,无需include...
运行
ldconfig -p
查看您的库是否已很好地包含在缓存中。
我也遇到同样的问题, 其解决方案是: 您收到错误的文件可能是实际文件与另一个版本的重复文件。因此,只需删除引发错误的特定文件即可解决问题。
在 shell 中简单运行: sudo apt-get install --reinstall libexpat1
libxcb 遇到同样的问题 - 以这种方式解决 - 非常快:)
通常使用版本。例如,您可以拥有
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
环境变量主要是“仅开发工具”。通常您不应该使用/设置它。