加载共享库时出现 Linux 错误:无法打开共享对象文件:没有此文件或目录
- 2024-09-30 14:02:00
- admin 原创
- 92
问题描述:
程序是 Xenomai 测试套件的一部分,从 Linux PC 交叉编译到 Linux+Xenomai ARM 工具链。
# echo $LD_LIBRARY_PATH
/lib
# ls /lib
ld-2.3.3.so libdl-2.3.3.so libpthread-0.10.so
ld-linux.so.2 libdl.so.2 libpthread.so.0
libc-2.3.3.so libgcc_s.so libpthread_rt.so
libc.so.6 libgcc_s.so.1 libstdc++.so.6
libcrypt-2.3.3.so libm-2.3.3.so libstdc++.so.6.0.9
libcrypt.so.1 libm.so.6
# ./clocktest
./clocktest: error while loading shared libraries: libpthread_rt.so.1: cannot open shared object file: No such file or directory
.1
文件名末尾有 吗?那到底是什么意思?
解决方案 1:
你的库是一个动态库。你需要告诉操作系统在运行时它可以在哪里找到它。
为此,我们需要执行以下简单的步骤:
如果您不知道图书馆的位置,请找到它的位置。
sudo find / -name the_name_of_the_file.so
检查动态库路径环境变量是否存在(
LD_LIBRARY_PATH
)
echo $LD_LIBRARY_PATH
如果没有任何内容可显示,请添加默认路径值(如果愿意,可以不添加)
LD_LIBRARY_PATH=/usr/local/lib
我们添加所需的路径,将其导出并尝试该应用程序。
请注意,路径应为 所在的目录path.so.something
。因此,如果path.so.something
位于 中/my_library/path.so.something
,则应为:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_library/
解决方案 2:
您可以尝试以下几种解决方案:
ldconfig
正如 AbiusX 指出的那样:如果您刚刚安装了该库,您可能只需要运行ldconfig。
sudo ldconfig
ldconfig 创建必要的链接和缓存,指向在命令行上指定的目录、文件 /etc/ld.so.conf 和受信任的目录(/lib 和 /usr/lib)中找到的最新共享库。
通常,当您安装新库时,包管理器会处理这个问题,但并非总是如此,即使这不是您的问题,运行 ldconfig 也不会有什么坏处。
开发包或错误版本
如果这不起作用,我还会查看Paul 的建议并寻找“-dev”版本的库。许多库分为 dev 和非 dev 包。您可以使用以下命令查找它:
apt-cache search <libraryname>
如果您只是安装了错误版本的库,这也会有所帮助。一些库同时发布了不同的版本,例如 Python。
图书馆位置
如果您确定安装了正确的软件包,而 ldconfig 找不到它,那么它可能只是在非标准目录中。默认情况下,ldconfig 会在/lib
、/usr/lib
和/etc/ld.so.conf
和 中列出的目录中查找$LD_LIBRARY_PATH
。如果您的库在其他地方,您可以在 中单独一行中添加目录/etc/ld.so.conf
,将库的路径附加到$LD_LIBRARY_PATH
,或将库移动到/usr/lib
。然后运行ldconfig
。
要找到图书馆在哪里,请尝试以下操作:
sudo find / -iname *libraryname*.so*
(替换libraryname
为您的图书馆名称)
如果您选择这条$LD_LIBRARY_PATH
路线,您需要将其放入您的~/.bashrc
文件中,以便它每次您登录时都会运行:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library
解决方案 3:
更新
虽然我下面所写的关于共享库的一般答案是正确的,但我认为出现此类消息的最常见原因是您安装了一个包,但没有安装-dev
该包的版本。
好吧,它没撒谎——列表中没有libpthread_rt.so.1
。你可能需要重新配置并重新构建它,以便它依赖于你拥有的库,或者安装任何提供的libpthread_rt.so.1
。
通常,.so 后面的数字是版本号,并且您经常会发现它们是彼此的符号链接,因此如果您拥有 libfoo.so 的 1.1 版本,那么您将有一个真正的文件 libfoo.so.1.0,以及指向 libfoo.so.1.0 的符号链接 foo.so 和 foo.so.1。并且如果您安装版本 1.1 而不删除另一个版本,那么您将拥有一个 libfoo.so.1.1,并且 libfoo.so.1 和 libfoo.so 现在将指向新的版本,但是任何需要该精确版本的代码都可以使用 libfoo.so.1.0 文件。仅依赖版本 1 API 但不关心它是 1.0 还是 1.1 的代码将指定 libfoo.so.1。正如orip在评论中指出的那样,这里对此进行了很好的解释。
对于你的情况,你可以使用符号链接libpthread_rt.so.1
到libpthread_rt.so
。不过,不能保证它不会破坏你的代码并抢走你的电视晚餐。
解决方案 4:
您需要确保在编译.c 文件时在链接期间指定库路径:
gcc -I/usr/local/include xxx.c -o xxx -L/usr/local/lib -Wl,-R/usr/local/lib
该部分告诉生成的二进制文件在尝试使用中的库之前-Wl,-R
还要在运行时查找中的库。/usr/local/lib
`/usr/lib/`
解决方案 5:
尝试将LD_LIBRARY_PATH
指示搜索路径~/.bashrc
的
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library
有用!
解决方案 6:
linux.org参考页面解释了其机制,但没有解释其背后的动机 :-(
有关信息,请参见Sun Linker and Libraries Guide
此外,请注意,“外部版本控制”在 Linux 上已基本过时,因为符号版本控制(GNU 扩展)允许您在单个库中同时存在同一函数的多个不兼容版本。此扩展允许 glibc 拥有相同的外部版本:libc.so.6
过去 10 年。
解决方案 7:
cd /home/<user_name>/
sudo vi .bash_profile
在最后添加以下几行
LD_LIBRARY_PATH=/usr/local/lib:<any other paths you want>
export LD_LIBRARY_PATH
解决方案 8:
另一种可能的解决方案取决于您的情况。
如果您知道 libpthread_rt.so.1 与 libpthread_rt.so 相同,那么您可以通过以下方式创建符号链接:
ln -s /lib/libpthread_rt.so /lib/libpthread_rt.so.1
然后ls -l /lib
现在应该显示符号链接以及它指向的内容。
解决方案 9:
想要补充的是,如果您的库位于非标准路径,请ldconfig
按照路径运行。
例如我必须运行:
sudo ldconfig /opt/intel/oneapi/mkl/2021.2.0/lib/intel64
使 R 针对 Intel MKL 进行编译
解决方案 10:
我遇到了类似的错误,在 ~/.bashrc 中提供 LD_LIBRARY_PATH 也无法解决问题。解决我问题的方法是添加 .conf 文件并加载它。转到终端并进入 su。
gedit /etc/ld.so.conf.d/myapp.conf
在此文件中添加您的库路径并保存。(例如:/usr/local/lib)。您必须运行以下命令来激活路径:
ldconfig
验证您的新库路径:
ldconfig -v | less
如果这显示了您的库文件,那么您就可以开始了。
解决方案 11:
在 Linux x86 上使用 Eclipse CDT 运行应用程序时出现此错误。
要修复此问题:
在 Eclipse 中:
运行方式 -> 运行配置 -> 环境
设置路径
LD_LIBRARY_PATH=/my_lib_directory_path
解决方案 12:
.dll
如果您在 Microsoft Windows 上运行应用程序,则需要在环境变量中定义动态库()的路径PATH
。
.so
如果您在 UNIX 上运行应用程序,则需要在环境变量中定义动态库()的路径LD_LIBRARY_PATH
。
解决方案 13:
尝试安装lib32z1:
sudo apt-get install lib32z1
解决方案 14:
我使用 Ubuntu 18.04
安装相应的-dev
软件包对我来说是有效的,
sudo apt install libgconf2-dev
在安装上述软件包之前,我收到以下错误:
turtl: error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory
解决方案 15:
我所要做的就是运行:
sudo apt-get install libfontconfig1
我位于该文件夹中/usr/lib/x86_64-linux-gnu
,它运行完美。
解决方案 16:
发生此错误是因为系统无法引用所提到的库文件。请采取以下步骤:
运行
locate libpthread_rt.so.1
将列出所有具有该名称的文件的路径。假设路径为/home/user/loc
。复制路径并运行
cd home/USERNAME
。将 USERNAME 替换为您要运行该文件的当前活动用户的名称。运行
vi .bash_profile
并在参数末尾LD_LIBRARY_PATH
(就在 之前.
)添加行/lib://home/usr/loc:.
。保存文件。关闭终端并重新启动应用程序。它应该运行。
解决方案 17:
我遇到了这个错误,我认为这和你的原因是一样的
加载共享库时出错:libnw.so:无法打开共享对象文件:没有此文件或目录
试试这个。修复文件权限:
cd /opt/Popcorn (or wherever it is)
chmod -R 555 * (755 if not ok)
解决方案 18:
我遇到了这个错误,我认为这和你的原因是一样的
error while loading shared libraries: libnw.so: cannot open shared object
file: No such file or directory
试试这个。修复文件权限:
sudo su
cd /opt/Popcorn (or wherever it is)
chmod -R 555 * (755 if not ok)
chown -R root:root *
解决方案 19:
这里有类似的问题 。我试过提到的解决方案,它确实有效。
前面问题中的解决方案可能有效。但以下是修复此问题的简单方法。通过libwbclient
在 Fedora 中重新安装软件包即可:
dnf reinstall libwbclient
解决方案 20:
原因/解决方案
Apparmor:
在较新的 Debian 版本中(我认为 >= Debian11),从 debian repo 安装 clamav 时配置了 apparmor。
如果在重新安装clamav deb 包之前没有完全卸载 clamav ,或者配置中发生了任何变化(例如 clamav 定义路径),则还必须在/etc/apparmor.d/usr.sbin.clamd
(之后systemctl reload apparmor
:)中进行调整
一个弱但即时的解决方法是添加标志来放宽 apparmor,这样它会记录并抱怨对非常规位置的访问,但不会严重失败:
/usr/local/sbin/clamd flags=(complain,attach_disconnected){
...
tldr
我在 2024 年使用 clamav 时遇到了这个问题:
/usr/local/sbin/clamd:加载共享库时出错:libclamav.so.11:无法打开共享对象文件:没有此文件或目录
尽管 /usr/local/lib 中的权限正确,但strace /usr/local/sbin/clamd
显示:
openat(AT_FDCWD,“/usr/local/lib/libclamav.so.11”,O_RDONLY|O_CLOEXEC) = -1 EACCES(权限被拒绝)
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件