首页 文章

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

提问于
浏览
259

Program是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

Edit: 好的我没注意到.1末尾是文件名的一部分 . 这究竟是什么意思?

17 回答

  • 115

    Update
    虽然我在下面写的内容是关于共享库的一般答案,但我认为这些消息的最常见原因是因为您安装了一个软件包,但没有安装该软件包的"-dev"版本 .


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

    通常,.so之后的数字是版本号,并且你有一个真正的文件libfoo.so.1.0,以及指向libfoo.so.1.0的符号链接foo.so和foo.so.1 . 如果您在不删除另一个版本的情况下安装版本1.1,则需要注意它是1.0还是1.1将指定libfoo.so.1 . 正如orip在评论中指出的那样,这在http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html得到了很好的解释 .

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

  • 7

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

    为此,我们需要执行以下简单步骤:

    (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

  • 2

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

    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

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

    sudo ldconfig -v
    

    希望这可以帮助 .

  • 12

    在编译.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 /中的库

    希望它会对你有所帮助 .

  • 4

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

    为此,请参阅Sun Linker and Libraries Guide

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

  • 2

    尝试将 LD_LIBRARY_PATH (表示搜索路径)添加到 ~/.bashrc 文件中

    LD_LIBRARY_PATH=path_to_your_library
    

    有用!

  • 2
    cd /home/<user_name>/
    sudo vi .bash_profile
    

    最后添加这些行

    LD_LIBRARY_PATH=/usr/local/lib:<any other paths you want>
    export LD_LIBRARY_PATH
    
  • 48

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

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

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

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

  • 113

    尝试安装sudo lib32z1

    sudo apt-get install lib32z1

  • 0

    我所要做的就是跑:

    sudo apt-get install libfontconfig1
    

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

  • 18

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

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

  • 238

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

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

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

    ldconfig
    

    验证您的新库路径:

    ldconfig -v | less
    

    如果这显示了您的库文件,那么您很高兴 .

  • 10

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

    • 在Eclipse中:

    运行方式 - >运行配置 - >环境

    • 设置路径
    LD_LIBRARY_PATH=/my_lib_directory_path
    
  • 0

    由于系统无法引用所提及的库文件,因此会发生错误 . 采取以下步骤:

    • 运行 locate libpthread_rt.so.1 将列出具有该名称的所有文件的路径 . 我们假设一条路径是 /home/user/loc .

    • 复制路径并运行 cd home/USERNAME . 将USERNAME替换为您要用于运行该文件的当前活动用户的名称 .

    • 运行 vi .bash_profile 并在 LD_LIBRARY_PATH 参数的末尾,就在 . 之前,添加 /lib://home/usr/loc:. 行 . 保存文件 .

    • 关闭终端并重启应用程序 . 它应该运行 .

  • 2

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

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

    试试这个 . Fix permissions 关于文件:

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

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

  • 1

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

    加载共享库时出错:libnw.so:无法打开共享对象文件:没有这样的文件或目录

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

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

相关问题