加载共享库时出现Linux错误:无法打开共享目标文件:没有这样的文件或目录

程序是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是文件名的结尾部分吗?这到底是什么意思?

1625381 次浏览
< p > 更新
虽然我下面所写的是关于共享库的一般答案,但我认为这类消息最常见的原因是因为你安装了一个包,但没有安装该包的-dev版本

好吧,这不是撒谎——在那个清单中没有libpthread_rt.so.1。你可能需要重新配置和重新构建它,以便它取决于你拥有的库,或者安装任何提供libpthread_rt.so.1的库。

通常,.so后面的数字是版本号,您经常会发现它们是彼此之间的符号链接,所以如果您使用的是libfoo的1.1版本。你会有一个真正的文件libfoo。So。1.0,和symlinks foo。所以和foo。So。1指向libfoo.so.1.0。如果你安装了版本1.1而不移除另一个,你就会有libfoo。so.1.1和libfoo.so。1和libfoo。因此现在将指向新版本,但任何需要该版本的代码都可以使用libfoo.so.1.0文件。仅依赖于版本1 API,但不关心它是1.0还是1.1的代码将指定libfoo.so.1。正如orip在评论中指出的那样,这在在这里中得到了很好的解释。

在你的例子中,你可能摆脱了libpthread_rt.so.1libpthread_rt.so的符号链接。不过,不能保证它不会破坏你的代码并吃掉你的电视晚餐。

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

为此,请参见太阳链接器和图书馆指南

此外,请注意“外部版本”;在Linux上基本上已经过时了,因为符号版本控制(GNU扩展)允许您在一个库中呈现相同函数的多个不兼容版本。这个扩展允许glibc在过去10年里拥有相同的外部版本:libc.so.6

尝试安装lib32z1:

sudo apt-get install lib32z1

您的库是动态库。 你需要告诉操作系统在运行时它可以在哪里找到它

这样做,

  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
    

引用源 .

尝试在你的~/.bashrc文件中添加LD_LIBRARY_PATH,它表示搜索路径

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library

它的工作原理!

这里有一些你可以尝试的解决方案:

ldconfig

正如AbiusX指出的:如果你刚刚安装了这个库,你可能只需要运行ldconfig

sudo ldconfig

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

通常您的包管理器会在安装新库时处理这个问题,但并非总是如此,即使这不是您的问题,运行ldconfig也无妨。

开发包或版本错误

如果这不起作用,我也会检查保罗的建议并寻找一个“-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

我要做的就是跑

sudo apt-get install libfontconfig1

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

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

如果你知道libpthread_rt.so。1与libpthread_rt相同。然后你可以创建一个符号链接:

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

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

由于系统无法引用提到的库文件而发生错误。采取以下步骤:

  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. 关闭终端并重新启动应用程序。它应该运行。

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

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

您需要确保您在期间指定了库路径 当你编译你的。c文件时链接:

gcc -I/usr/local/include xxx.c -o xxx -L/usr/local/lib -Wl,-R/usr/local/lib
-Wl,-R部分告诉生成的二进制文件也查找库 在运行时尝试使用/usr/lib/中的一个之前,在/usr/local/lib中的一个
cd /home/<user_name>/
sudo vi .bash_profile

把这几行加在末尾

LD_LIBRARY_PATH=/usr/local/lib:<any other paths you want>
export LD_LIBRARY_PATH
我在Linux x86上用Eclipse CDT运行我的应用程序时遇到了这个错误 解决方法:

    <李>在Eclipse中:

    执行命令as ->执行配置命令->环境

    李< /引用> < / >
  1. 设置路径

    LD_LIBRARY_PATH=/my_lib_directory_path
    

我有一个类似的错误,它没有修复给LD_LIBRARY_PATH ~/。bashrc。( 解决我的问题是通过添加.conf文件并加载它。

gedit /etc/ld.so.conf.d/myapp.conf
在这个文件中添加你的库路径并保存。(如:/usr/local/lib)。

.使用实例
ldconfig

验证您的新库路径:

ldconfig -v | less

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

我得到了这个错误,我想这和你的原因一样

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 *

我得到了这个错误,我想这和你的原因一样

错误时加载共享库:libnw。所以:不能打开共享 object文件:没有这样的文件或目录

试试这个。修复文件权限:

cd /opt/Popcorn (or wherever it is)
chmod -R 555 * (755 if not ok)
类似的问题可以在在这里中找到。 我已经尝试了上面提到的解决方案,它实际上是有效的

前面问题的答案可能有效。但下面是一个简单的方法来解决它。 它通过重新安装包libwbclient来工作 在fedora: < / p >

dnf reinstall libwbclient

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

想要添加的是,如果你的库在非标准路径中,运行ldconfig后跟路径。

例如,我必须跑:

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

在Intel MKL上编译R

运行:

sudo ldconfig

足以解决我的问题。