首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >加载共享库时出现Linux错误:无法打开共享目标文件:没有这样的文件或目录

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

Stack Overflow用户
提问于 2009-01-27 02:07:57
回答 21查看 1.4M关注 0票数 433

程序是Xenomai测试套件的一部分,从Linux交叉编译到Linux+Xenomai ARM工具链。

代码语言:javascript
复制
# 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是文件名的一部分。这到底是什么意思?

EN

回答 21

Stack Overflow用户

回答已采纳

发布于 2009-01-26 18:11:59

更新

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

好吧,这不是骗人的--该清单中没有libpthread_rt.so.1。您可能需要重新配置和重新构建它,使其依赖于您拥有的库,或者安装提供libpthread_rt.so.1的任何东西。

通常,.so后面的数字是版本号,并且您经常会发现它们是相互之间的符号链接,所以如果您使用的是1.1版的libfoo.so,那么您将拥有一个真正的文件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在评论中指出的那样,at here很好地解释了这一点。

在您的例子中,您可以将libpthread_rt.so.1符号链接到libpthread_rt.so。然而,不能保证它不会破坏你的代码,吃掉你的电视晚餐。

票数 148
EN

Stack Overflow用户

发布于 2014-01-17 06:07:15

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

要做到这一点,我们需要执行这些简单的步骤:

  1. 如果您不知道库所在的位置,请查找它。

代码语言:javascript
复制
sudo find / -name the_name_of_the_file.so

检查是否存在动态库路径环境variable(LD_LIBRARY_PATH)的

代码语言:javascript
复制
$ echo $LD_LIBRARY_PATH

如果没有要显示的内容,则添加默认路径值(如果愿意,也可以不添加)。

代码语言:javascript
复制
$ LD_LIBRARY_PATH=/usr/local/lib

我们添加所需的路径,将其导出并尝试application.,然后使用

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

代码语言:javascript
复制
$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_library/
$ export LD_LIBRARY_PATH
$ ./my_app

Reference to source

票数 418
EN

Stack Overflow用户

发布于 2015-02-12 01:11:07

这里有几个你可以尝试的解决方案:

ldconfig

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

代码语言:javascript
复制
sudo ldconfig

usr ldconfig创建必要的链接和缓存,指向在命令行指定的目录、文件/

/ld.so.conf和受信任目录(/lib和/usr/lib)中找到的最新共享库。

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

开发包或版本错误

如果这不起作用,我还会查看Paul's suggestion并查找该库的"-dev“版本。许多库被分成开发包和非开发包。您可以使用以下命令来查找它:

代码语言:javascript
复制
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

要查找该库的位置,请尝试以下命令:

代码语言:javascript
复制
sudo find / -iname *libraryname*.so*

(将libraryname替换为库的名称)

如果使用$LD_LIBRARY_PATH路径,则需要将其放入~/.bashrc文件中,这样每次登录时它都会运行:

代码语言:javascript
复制
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library
票数 199
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/480764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档