程序是 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
在文件名的末尾吗?这到底是什么意思?
您的库是一个动态库。您需要告诉操作系统它可以在运行时找到它的位置。
为此,我们需要执行以下简单步骤:
如果您不知道,请查找图书馆的放置位置。 sudo find / -name the_name_of_the_file.so 检查是否存在动态库路径环境变量(LD_LIBRARY_PATH) echo $LD_LIBRARY_PATH 如果没有要显示的内容,请添加默认路径值(如果您愿意,也可以不添加) LD_LIBRARY_PATH=/usr /local/lib 我们添加所需的路径,将其导出并尝试应用程序。请注意,路径应该是 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
以下是您可以尝试的一些解决方案:
配置文件
正如 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
.conf
文件与我需要的非标准库路径添加到 /etc/ld.so.conf.d
(由 /etc/ld.so.conf
指向)就可以了。
/etc/ld.so.conf.d
中添加了自己的 .conf。之后我(显然)必须运行 ldconfig 并且它工作。我能感觉到你@DarenW。这是一个痛苦的屁股
更新
虽然我在下面写的作为关于共享库的一般答案是正确的,但我认为这类消息的最常见原因是因为您安装了一个包,但没有安装该软件包的 -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,这已得到很好的解释 at here。
在您的情况下,您可能可以将 libpthread_rt.so.1
符号链接到 libpthread_rt.so
。但是,不能保证它不会破坏您的密码并吃掉您的电视晚餐。
您需要确保在编译 .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
。
尝试将表示搜索路径的 LD_LIBRARY_PATH
添加到您的 ~/.bashrc
文件中
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library
有用!
linux.org reference page 解释了机制,但没有解释其背后的任何动机 :-(
为此,请参阅 Sun Linker and Libraries Guide
此外,请注意“外部版本控制”在 Linux 上已基本过时,因为符号版本控制(GNU 扩展)允许您在单个库中存在同一函数的多个不兼容版本。此扩展允许 glibc 在过去 10 年中拥有相同的外部版本:libc.so.6
。
cd /home/<user_name>/
sudo vi .bash_profile
在末尾添加这些行
LD_LIBRARY_PATH=/usr/local/lib:<any other paths you want>
export LD_LIBRARY_PATH
另一种可能的解决方案取决于您的情况。
如果您知道 libpthread_rt.so.1 与 libpthread_rt.so 相同,则可以通过以下方式创建符号链接:
ln -s /lib/libpthread_rt.so /lib/libpthread_rt.so.1
然后 ls -l /lib
现在应该显示符号链接及其指向的内容。
我遇到了类似的错误,但在 ~/.bashrc 中给出 LD_LIBRARY_PATH 并没有解决。解决我的问题的是添加 .conf 文件并加载它。转到终端并在 su 中。
gedit /etc/ld.so.conf.d/myapp.conf
在此文件中添加您的库路径并保存。(例如:/usr/local/lib)。您必须运行以下命令来激活路径:
ldconfig
验证您的新库路径:
ldconfig -v | less
如果这显示了您的库文件,那么您就可以开始了。
gedit
?您使用 GUI 操作系统配置文件?哇哇哇
在 Linux x86 上使用 Eclipse CDT 运行我的应用程序时出现此错误。要解决这个问题:
在 Eclipse 中:运行方式 -> 运行配置 -> 环境 设置路径 LD_LIBRARY_PATH=/my_lib_directory_path
跑步:
sudo ldconfig
足以解决我的问题。
想要添加,如果您的库位于非标准路径中,请运行 ldconfig
后跟路径。
例如我必须运行:
sudo ldconfig /opt/intel/oneapi/mkl/2021.2.0/lib/intel64
使 R 针对英特尔 MKL 进行编译
我所要做的就是运行:
sudo apt-get install libfontconfig1
我在位于 /usr/lib/x86_64-linux-gnu
的文件夹中,它运行良好。
尝试安装 lib32z1:
sudo apt-get install lib32z1
如果您在 Microsoft Windows 上运行应用程序,则需要在 PATH
环境变量中定义动态库 (.dll
) 的路径。
如果您在 UNIX 上运行应用程序,则需要在 LD_LIBRARY_PATH
环境变量中定义动态库 (.so
) 的路径。
由于系统无法引用提到的库文件,因此发生错误。采取以下步骤:
运行 locate libpthread_rt.so.1 将列出所有具有该名称的文件的路径。假设路径是/home/user/loc。复制路径并运行 cd home/USERNAME。将 USERNAME 替换为要运行文件的当前活动用户的名称。运行 vi .bash_profile 并在 LD_LIBRARY_PATH 参数的末尾,就在 . 之前,添加行 /lib://home/usr/loc:.. 保存文件。关闭终端并重新启动应用程序。它应该运行。
我收到了这个错误,我认为这与你的原因相同
加载共享库时出错:libnw.so:无法打开共享对象文件:没有这样的文件或目录
尝试这个。修复文件的权限:
cd /opt/Popcorn (or wherever it is)
chmod -R 555 * (755 if not ok)
我使用 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
我收到了这个错误,我认为这与你的原因相同
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 *
可以找到类似的问题here。我已经尝试过上述解决方案,它确实有效。
前面问题中的解决方案可能有效。但以下是修复它的简单方法。它通过在 fedora 中重新安装软件包 libwbclient
来工作:
dnf reinstall libwbclient
您可以在此处阅读有关库的信息:https://domiyanyue.medium.com/c-development-tutorial-4-static-and-dynamic-libraries-7b537656163e
不定期副业成功案例分享
LD_LIBRARY_PATH
应该指向包含path.so.something
的目录,而不是path.so.something
本身。sudo ldconfig
的系统(例如超级计算机),这是正确的解决方案。export LD_LIBRARY_PATH
命令是必不可少的,以便其他程序可以读取环境变量。没有它,只有 shell 才能看到变量。