加载共享库时出现Linux错误:无法打开共享对象文件:没有此类文件或目录

时间:2009-01-26 18:07:57

标签: linux shared-libraries file-not-found xenomai

程序是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末尾是文件名的一部分。这究竟是什么意思?

20 个答案:

答案 0 :(得分:263)

您的图书馆是一个动态图书馆。 您需要告诉操作系统它可以在运行时找到它。

要这样做, 我们需要做这些简单的步骤:

(1)如果您不知道图书馆,请查找图书馆的位置。

sudo find / -name the_name_of_the_file.so

(2)检查是否存在动态库路径环境变量(LD_LIBRARY_PATH

$ echo $LD_LIBRARY_PATH

如果没有要显示的内容,请添加默认路径值(如果您愿意,则添加)

$ LD_LIBRARY_PATH=/usr/local/lib

(3)我们添加欲望路径,导出它并尝试应用程序。

请注意,路径应该是path.so.something所在的目录。 因此,如果path.so.something位于/my_library/path.so.something,则应为:

$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_library/
$ export LD_LIBRARY_PATH
$ ./my_app

来源:http://www.gnu.org/software/gsl/manual/html_node/Shared-Libraries.html

答案 1 :(得分:127)

您可以尝试以下几种解决方案:

LDCONFIG

正如AbiusX所指出的:如果您刚刚安装了库,则可能只需要运行ldconfig

sudo ldconfig
  

ldconfig创建必要的链接并缓存到最新的   在命令中指定的目录中找到的共享库   在文件/etc/ld.so.conf和受信任的目录中   (/ lib和/ usr / lib)。

通常,您的软件包管理器会在您安装新库时对此进行处理,但并非总是如此,即使这不是您的问题,运行ldconfig也不会受到影响。

开发包或错误版本

如果这不起作用,我还会查看Paul's suggestion并查找该库的“-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

答案 2 :(得分:123)

<强>更新
虽然我在下面写的是关于共享库的一般答案,但我认为这些消息的最常见原因是因为你安装了一个软件包,但没有安装该软件包的“-dev”版本。


嗯,这不是谎言 - 该列表中没有libpthread_rt.so.1。您可能需要重新配置并重新构建它,以便它取决于您拥有的库,或安装提供libpthread_rt.so.1的任何内容。

通常,.so之后的数字是版本号,你经常会发现它们是彼此的符号链接,所以如果你有1.1版的libfoo.so,你将拥有一个真实的文件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在评论中指出的那样,http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html已经很好地解释了这一点。

在您的情况下,可能通过符号链接libpthread_rt.so.1libpthread_rt.so。但不保证它不会破坏你的代码并吃掉你的电视晚餐。

答案 3 :(得分:48)

我有类似的错误,我可以通过给予解决它,

sudo ldconfig -v

希望这会有所帮助。

答案 4 :(得分:19)

您需要确保在此期间指定库路径 编译.c文件时链接:

  

gcc -I / usr / local / include xxx.c -o xxx -L / usr / local / lib   -Wl,-R / USR /本地/ lib中

-Wl,-R部分告诉生成的二进制文件也查找库 在运行时在/ usr / local / lib中尝试使用/ usr / lib /

中的那个

希望它会对你有所帮助。

答案 5 :(得分:12)

linux.org参考页面解释了机制,但没有解释其背后的任何动机: - (

为此,请参阅Sun Linker and Libraries Guide

此外,请注意,“外部版本控制”在Linux上基本上已经过时,因为符号版本控制(GNU扩展)允许您在单个库中存在同一功能的多个不兼容版本。此扩展允许glibc在过去10年中具有相同的外部版本:libc.so.6

答案 6 :(得分:10)

尝试将指示搜索路径的LD_LIBRARY_PATH添加到~/.bashrc文件

LD_LIBRARY_PATH=path_to_your_library

有效!

答案 7 :(得分: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 :(得分:4)

另一种可能的解决方案取决于您的情况。

如果您知道libpthread_rt.so.1与libpthread_rt.so相同,那么您可以通过以下方式创建符号链接:

ln -s /lib/libpthread_rt.so /lib/libpthread_rt.so.1

然后ls -l /lib现在应该显示符号链接及其指向的内容。

答案 9 :(得分:3)

我遇到了类似的错误,并没有在〜/ .bashrc中给出LD_LIBRARY_PATH。 解决我的问题的方法是添加.conf文件并加载它。 转到终端a su。

gedit /etc/ld.so.conf.d/myapp.conf

在此文件中添加库路径并保存。(例如:/ usr / local / lib)。 您必须运行以下命令才能激活路径:

ldconfig

验证您的新图书馆路径:

ldconfig -v | less

如果这显示了你的库文件,那么你就可以了。

答案 10 :(得分:3)

在Linux x86上使用Eclipse CDT运行我的应用程序时出现此错误 解决这个问题:

  1. 在Eclipse中:
      

    以 - &gt;运行运行配置 - &gt;环境

  2. 设置路径

    LD_LIBRARY_PATH=/my_lib_directory_path
    

答案 11 :(得分:2)

如果您在Microsoft Windows上运行应用程序,则需要在PATH环境变量中定义动态库(.dll)的路径。

如果在UNIX上运行应用程序,则需要在LD_LIBRARY_PATH环境变量中定义动态库(.so)的路径。

答案 12 :(得分:2)

我所要做的只是运行:

sudo apt-get install libfontconfig1

我在位于/usr/lib/x86_64-linux-gnu的文件夹中,工作得很好。

答案 13 :(得分:2)

尝试安装sudo lib32z1

  

sudo apt-get install lib32z1

答案 14 :(得分:1)

由于系统无法引用上述库文件,因此发生错误。请执行以下步骤:

  1. 运行locate libpthread_rt.so.1将列出具有该名称的所有文件的路径。我们假设路径为/home/user/loc
  2. 复制路径并运行cd home/USERNAME。将USERNAME替换为您要用于运行该文件的当前活动用户的名称。
  3. 运行vi .bash_profile并在LD_LIBRARY_PATH参数的末尾,.之前,添加第/lib://home/usr/loc:.行。保存文件。
  4. 关闭终端并重新启动应用程序。它应该运行。

答案 15 :(得分:1)

我使用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

答案 16 :(得分:0)

我收到了这个错误,我认为这与你的原因相同

error while loading shared libraries: libnw.so: cannot open shared object 
file: No such file or directory

试试这个。文件修复权限

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 
chown -R root:root *

“sudo su”获取文件系统的权限。

答案 17 :(得分:0)

我收到此错误,我认为与您的原因相同

  加载共享库时出现

错误:libnw.so:无法打开共享   目标文件:没有这样的文件或目录

尝试一下。修复文件权限:

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 

答案 18 :(得分:0)

在这里发现类似的问题:https://bugzilla.redhat.com/show_bug.cgi?id=1456202 我已经尝试了上述解决方案,并且确实有效。

前面问题中的解决方案可能会起作用。但是我认为这是修复它的简便方法。 尝试重新安装软件包libwbclient 在fedora中:

dnf reinstall libwbclient

答案 19 :(得分:0)

想要添加,如果您的库位于非标准路径中,请运行 ldconfig 后跟路径。

例如我必须运行:

sudo ldconfig /opt/intel/oneapi/mkl/2021.2.0/lib/intel64

使 R 针对英特尔 MKL 进行编译