当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《加载共享库时出现Linux错误:无法打开共享对象文件:没有此类文件或目录》经验,为你挑选了8个好方法。

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                                 

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



1> XOR..:

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

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

(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


导出库后尝试"ldconfig"命令.您可能需要以"sudo"执行此命令.
步骤(1)中的所有命令都可以单独使用`find`来完成:`find/-name the_name_of_the_file.so`
上面提到的答案很清楚,先谢谢你.我尝试在Eclipse CDT项目路径(Lubuntu)中执行此操作./ debug $ echo $ LD_LIBRARY_PATH /home/akhil/HDE/x86.linux/lib:/home/akhil/HDE/x86.linux/lib .."/home/akhil/HDE/x86.linux/lib"这是哪里我的库实际上是可用的,但我仍然得到同样的错误.有什么建议!
我相信`LD_LIBRARY_PATH`应该指向包含`path.so.something`的目录,而不是指向`path.so.something`本身.

2> amo..:

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

LDCONFIG

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

sudo ldconfig

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

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

开发包或错误的版本

如果这不起作用,我还会查看Paul的建议,并寻找图书馆的"-dev"版本.许多库分为开发和非开发包.您可以使用此命令查找它:

apt-cache search 

如果您只安装了错误的库版本,这也会有所帮助.有些库同时以不同版本发布,例如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


这才是真正的答案
需要运行ldconfig的+1.我没有使用包管理器.我必须从源代码编译,所以这是必要的.
默认情况下,/ lib和/ usr/lib而不是/ usr/local/lib?这让我在职业生涯中浪费了几次,浪费了几个小时.

3> Paul Tomblin..:

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


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

通常,.so之后的数字是版本号,你经常会发现它们是彼此的符号链接,所以如果你有libfoo.so的1.1版本,你将拥有一个真正的文件libfoo.so.1.0,和符号链接foo.so和foo.so.1指向libfoo.so.1.0.如果您安装版本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.1来逃避libpthread_rt.so.但不保证它不会破坏你的代码并吃掉你的电视晚餐.


...哦天啊,.1是文件名的一部分.知道这是什么意思吗?

4> 小智..:

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

sudo ldconfig -v

希望这可以帮助.


Hiya,这可能很好地解决了这个问题......但如果你能编辑你的答案并提供一些关于它如何以及为什么工作的解释,那就好了.别忘了 - 堆栈溢出有很多新手,他们可以从你的专业知识中学到一两件事 - 对你来说显而易见的事情对他们来说可能并非如此.

5> 小智..:

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

希望它会对你有所帮助.


这是我正在寻找的选项.也许更好的是`-Wl,-rpath DIR`.

6> Employed Rus..:

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

为此,请参阅Sun链接器和库指南

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



7> 小智..:

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

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library

有用!



8> singingsingh..:
cd /home//
sudo vi .bash_profile

最后添加这些行

LD_LIBRARY_PATH=/usr/local/lib:
export LD_LIBRARY_PATH

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有