452

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

4

21 回答 21

440

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

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

  1. 如果您不知道,请查找图书馆的放置位置。
sudo find / -name the_name_of_the_file.so
  1. 检查动态库路径环境变量是否存在( LD_LIBRARY_PATH)
$ echo $LD_LIBRARY_PATH

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

$ LD_LIBRARY_PATH=/usr/local/lib
  1. 我们添加所需的路径,将其导出并尝试应用程序。

请注意,路径应该是它所在的目录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

参考来源

于 2014-01-16T22:07:14.560 回答
207

以下是您可以尝试的一些解决方案:

配置文件

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

sudo ldconfig

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

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

开发包或错误版本

如果这不起作用,我还会查看Paul 的建议并寻找库的“-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
于 2015-02-11T17:11:07.427 回答
148

更新
虽然我在下面写的内容作为关于共享库的一般答案是正确的,但我认为这类消息的最常见原因是因为您安装了一个包,但没有安装该-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在评论中指出的那样,这在这里得到了很好的解释。

在您的情况下,您可能会摆脱符号链接libpthread_rt.so.1libpthread_rt.so. 但是,不能保证它不会破坏您的密码并吃掉您的电视晚餐。

于 2009-01-26T18:11:59.323 回答
36

您需要确保在编译 .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/.

于 2016-03-23T16:29:42.610 回答
27

尝试将LD_LIBRARY_PATH指示搜索路径的 添加到您的~/.bashrc文件中

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library

有用!

于 2014-07-07T13:21:29.387 回答
13

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

为此,请参阅Sun Linker and Libraries Guide

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

于 2009-01-27T06:01:39.610 回答
7
cd /home/<user_name>/
sudo vi .bash_profile

在末尾添加这些行

LD_LIBRARY_PATH=/usr/local/lib:<any other paths you want>
export LD_LIBRARY_PATH
于 2016-06-21T17:36:15.340 回答
6

我遇到了类似的错误,但在 ~/.bashrc 中给出 LD_LIBRARY_PATH 并没有解决。解决我的问题的是添加 .conf 文件并加载它。转到终端并在 su 中。

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

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

ldconfig

验证您的新库路径:

ldconfig -v | less

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

于 2018-01-03T07:44:30.790 回答
5

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

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

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

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

于 2015-09-15T23:58:54.870 回答
4

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

  1. 在 Eclipse 中:

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

  2. 设置路径

    LD_LIBRARY_PATH=/my_lib_directory_path
    
于 2017-10-31T16:01:12.457 回答
3

跑步:

sudo ldconfig

足以解决我的问题。

于 2021-11-25T20:46:58.477 回答
2

尝试安装lib32z1

sudo apt-get install lib32z1

于 2014-01-07T14:34:16.677 回答
2

我所要做的就是运行:

sudo apt-get install libfontconfig1

我在位于的文件夹中/usr/lib/x86_64-linux-gnu,它运行良好。

于 2015-03-16T13:56:39.940 回答
2

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

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

于 2016-02-27T12:33:35.910 回答
2

想要添加,如果您的库位于非标准路径中,请在路径后运行ldconfig

例如我必须运行:

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

使 R 针对英特尔 MKL 进行编译

于 2021-06-21T15:51:01.430 回答
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. 关闭终端并重新启动应用程序。它应该运行。
于 2015-11-04T05:34:39.143 回答
1

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

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

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

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 
于 2018-06-19T17:47:49.540 回答
1

我使用 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
于 2020-06-02T17:06:48.873 回答
0

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

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 *
于 2018-04-07T09:36:02.713 回答
0

可以在 此处找到类似的问题。我已经尝试过上述解决方案,它确实有效。

前面问题中的解决方案可能有效。但以下是修复它的简单方法。它通过libwbclient 在 fedora 中重新安装软件包来工作:

dnf reinstall libwbclient
于 2019-07-10T00:55:51.913 回答
0

您可以在此处阅读有关库的信息: https ://domiyanyue.medium.com/c-development-tutorial-4-static-and-dynamic-libraries-7b537656163e

于 2022-01-30T15:21:38.183 回答