加载共享库时发生Linux错误:无法打开共享对象文件:没有这样的文件或目录


355

该程序是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。那到底是什么意思呢?


277
如果您最近安装了共享库并且此后未运行ldconfig(8),则可能会发生这种情况。做“ ldconfig”,没有任何危害。
AbiusX 2011年

25
+1到@AbiusX注释-运行sudo ldconfig(假设库实际上位于它们应位于的位置[/ usr / bin / lib /,/ usr / bin / include /,/ usr / local / lib /和/ usr / local / include / AFAIK],如果我错了,请纠正我)可以解决该问题。干杯!
AeroCross

请注意,如果以某种方式更改了您的lib文件的权限,也会出现此错误。将权限更改回644为我解决了。
Geoffrey H

Answers:


139

更新
尽管我在下面写的是关于共享库的一般答案,但我认为这类消息的最常见原因是因为您已经安装了一个软件包,但没有安装该软件包的“ -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.1libpthread_rt.so。但是,不能保证它不会破坏您的代码并吃您的电视晚餐。


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

orip应该为该链接+1。@orip,如果您不介意,我想在答案中添加您的链接吗?
Paul Tomblin,2009年

@PaulTomblin,修复grub时出现类似错误。您能帮我吗?这个问题-> askubuntu.com/questions/123275/cant-repair-grub/…–
Eray

@TomNysetvold和Paul,是的-这是同一份文件。
orip 2012年

在寻找此答案时,我遇到了很多错误的信息和回旋解决方案。我内心的某些事情告诉我继续搜索,直到找到单命令解决方案。
c..

325

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

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

(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


3
上面提到的答案很明确,谢谢。我尝试在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”这是我的库实际上甚至可用,但是仍然出现相同的错误。有什么建议么!
nahasapeemapetilon

12
导出库后,尝试“ ldconfig”命令。您可能需要以“ sudo”执行此命令。
XOR

5
步骤(1)中的所有命令都可以单独完成findfind / -name the_name_of_the_file.so
wbadart

3
我相信LD_LIBRARY_PATH应该指向包含的目录path.so.something,而不是指向path.so.something本身。
Gerrit

2
按照您的命令一步一步解决了我的问题!万分感谢!
Fisher Coder

156

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

ldconfig

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

sudo ldconfig

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

通常,安装新库时,软件包管理器会解决此问题,但并非总是如此,即使不是您的问题,运行ldconfig也不会有任何问题。

开发包或版本错误

如果那不起作用,我还将查看Paul的建议,并寻找该库的“ -dev”版本。许多库分为dev和non-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

3
默认情况下是/ lib和/ usr / lib,但不是/ usr / local / lib?那使我在职业生涯中几次退缩,浪费了很多时间。
DarenW

@DarenW对我来说,可以使用/ usr / local / lib。Ubuntu 14.04 LTS。
gon1332 2015年

使用需要添加.conf的非标准lib路径添加我自己的文件/etc/ld.so.conf.d(指向/etc/ld.so.conf)。
CivFan

4
+1需要运行ldconfig。我没有使用包管理器。我必须从源代码进行编译,因此这是必要的。
杰夫,

7
这是真正的答案
Scott Stensland

53

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

sudo ldconfig -v

希望这可以帮助。


37
嗨,这很可能解决了问题...但是,如果您可以编辑答案并提供一些有关其工作原理和原因的说明,那将是很好的:)不要忘记-堆栈溢出有很多新手,他们可以从您的专业知识中学到一两个东西-对您而言显而易见的可能对他们而言不是。
塔林东2015年

他将无法解释。他只是复制了答案。
Jhourlad Estrella

重复的答案...见前天精心设计的相同答案
Scott Stensland

25

您需要确保在编译.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中查找库。

希望对您有帮助。


3
这是我一直在寻找的选项。也许会更好-Wl,-rpath DIR
jrw32982支持Monica's

1
大!当我的程序使用cmake成功编译但由于错误而无法启动时,我遇到了该问题。这个答案解决了我的问题
Ivan Talalaev '17


13

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

为此,请参见《Sun Linker和库指南》。

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


7
cd /home/<user_name>/
sudo vi .bash_profile

在末尾添加这些行

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

5

我有一个类似的错误,并且无法通过在〜/ .bashrc中提供LD_LIBRARY_PATH来解决。解决我问题的方法是添加.conf文件并加载它。前往苏必利码头。

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

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

ldconfig

验证您的新库路径:

ldconfig -v | less

如果这显示您的库文件,那么您就很好了。


4

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

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

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

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


4

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

  1. 在Eclipse中:

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

  2. 设定路径

    LD_LIBRARY_PATH=/my_lib_directory_path
    

2

我要做的就是运行:

sudo apt-get install libfontconfig1

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


2

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

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



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

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”以获取文件系统的权限。


0

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

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

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

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


0

我使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.