【超详细教程】解决libxxx.so: cannot open shared object file: No file or directory

这篇具有很好参考价值的文章主要介绍了【超详细教程】解决libxxx.so: cannot open shared object file: No file or directory。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、参考资料

error while loading shared libraries的解决方案

libascend_hal.so: cannot open shared object file:No such…解决办法-云社区-华为云 (huaweicloud.com)

二、相关介绍

1. -lxxx.so命名

`lxxx` means `lib + lib-name + .so`

lc means libc.so, 
lltdl means libltdl.so, 
lXtst means libXts.so

2. 查找 .so 文件

ld -lxxx --verbose

gcc -lxxx --verbose

locate libhdf5.so
/usr/bin/ld: cannot find -lhdf5

# 这表示找不到库文件 libhdf5.so
# 若是其它库文件,则是 cannot find -lxxx ,其中 xxx 是库文件的名字。

解释说明

  • -lxxx 表示 lib + lib-name + .so。例如,-lhdf5 表示 libhdf5.so

3. 静态库与动态库

静态库 GCC 进行链接时,会把静态库中代码打包(复制)到可执行程序中,程序运行时,可执行文件里就包含了所有的代码,直接运行。

动态库 GCC 进行链接时,动态库的代码不会被打包到可执行程序中,只是打包一些有关于动态库的信息,在运行时才找到动态库文件位置,加载代码后才运行。

4. ldd指令

通过 ldd (list dynamic dependencies) 指令,检查动态库依赖关系。

【超详细教程】解决libxxx.so: cannot open shared object file: No file or directory

5. 搜索动态库路径

当系统加载可执行代码时候,能够知道其所依赖库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。

对于ELF 格式的可执行程序,是由 ld-linux.so 来完成的,找到库文件后将其载入内存。它先后搜索的顺序是:

  1. elf文件的 DT_RPATH 段;
  2. 环境变量 LD_LIBRARY_PATH
  3. /etc/ld.so.cache文件列表;
  4. /lib/usr/lib/usr/local/lib 目录。

6. ld.so.conf配置文件

ld.so.conf配置的作用是,将 /etc/ld.so.conf 列出的库文件路径缓存到 /etc/ld.so.cache以供使用。当安装完一些库文件,或者在 /etc/ld.so.conf 配置文件中增加新的库文件搜索路径,运行一下ldconfig,使所有的库文件都被缓存到文件 /etc/ld.so.cache 中。如果没有做以上操作,可能会找不到刚安装的库。

可以通过以下指令,更新ld.so.conf配置文件:

# 打开配置文件
sudo vi /etc/ld.so.conf

# 新增一行
/usr/local/lib

# 使配置生效
sudo ldconfig

# 查看配置
/sbin/ldconfig -v

三、问题描述

1. 情况一

/usr/bin/ld: cannot find -lxxx 的解决办法

make编译时,找不到 lxxx.so 动态库,导致报错。

/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lltdl
/usr/bin/ld: cannot find -lXtst

2. 情况二

run运行可执行文件,找不到 .so 动态库,导致报错。

error while loading shared libraries: libXXXXXXX.so.1: cannot open shared object file: No such file or directory

libcal.so: cannot open shared object file: No file or directory

【超详细教程】解决libxxx.so: cannot open shared object file: No file or directory

四、问题分析

1. 情况一

1.1 分析原因

默认情况下,编译器只会使用 /lib/usr/lib 这两个目录下的库文件,通常通过源码包进行安装时,如果不指定 –prefix,会将库安装在 /usr/local/lib 目录下;当运行程序需要链接动态库时,提示找不到相关的 .so 库,会报错。也就是说,/usr/local/lib目录不在系统默认的库搜索目录中,需要将目录加进去。

1.2 解决办法

可以设定 LD_LIBRARY_PATH 环境变量,程序运行时会在此环境变量指定的文件夹下寻找动态链接库。

1.2.1 修改环境变量(永久有效)

其实,对于由普通用户自己编译生成的.so库文件,比较好的做法是将这些.so库文件的路径用export指令加入到~/.bashrc中的LD_LIBRARY_PATH变量中,LD_LIBRARY_PATH是程序运行需要链接.so库时会去查找的一个目录,~/.bashrc是登陆或打开shell时会读取的文件,这样,每次用户登录时,都会把这些.so库文件的路径写入LD_LIBRARY_PATH,这样就可以正常地使用这些.so库文件了。

普通用户可直接修改~/.bashrc~/.bash_profile,该修改仅对当前用户有效。
root用户可修改/etc/profile,且对所有用户都有效。

以修改 ~/.bashrc 配置文件为例:

# 打开配置文件
vim ~/.bashrc

# 添加配置
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/hua/Myproject/1_basic/lib

# 若修改环境变量 LD_LIBRARY_PATH 不奏效,则修改变量 LIBRARY_PATH
export LIBRARY_PATH=$LIBRARY_PATH:/home/hua/Myproject/1_basic/lib

# 更新配置
source ~/.bashrc
1.2.2 修改环境变量(临时)

在终端使用export命令来配置环境变量,但仅限于当前终端;对于其他终端窗口则需要重新使用export命令才起作用。
export配置环境变量的格式为:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/hua/Myproject/1_basic/lib
1.2.3 运行成功

再次检查动态库依赖关系。

【超详细教程】解决libxxx.so: cannot open shared object file: No file or directory
【超详细教程】解决libxxx.so: cannot open shared object file: No file or directory

2. 情况二

2.1 分析原因

如果更新 ld.so.conf 配置文件,还是出现以上错误,那可能的原因是:当前用户没有读取库目录的权限。从其他主机上拷贝一些.so动态库,然后用root权限放到了/usr/local/lib 目录中(普通用户没有该目录的写权限),然后切换用户运行程序时,始终提示找不到.so库。用root权限增加到 /usr/local/lib 目录中的.so文件,对于普通用户而言,是没有访问权限的。所以,以普通用户运行程序,当需要链接.so库时,在/usr/local/lib中是查找不到的

2.2 解决办法

修改.so文件的权限。

sudo chown yoyo:yoyo /usr/local/lib/libhdf5.so

3. 情况三

能找到 .so 文件。

3.1 查找 .so 文件

locate libiconv.so
$ locate libiconv.so
/home/user/anaconda3/lib/libiconv.so   # <-- right here
/home/user/anaconda3/lib/libiconv.so.2
/home/user/anaconda3/lib/libiconv.so.2.5.1
/home/user/anaconda3/lib/preloadable_libiconv.so
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so.2
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so.2.5.1

3.2 创建软连接

Link it to the right place, usually it is /lib64 or /usr/lib64

$ sudo ln -s /home/user/anaconda3/lib/libiconv.so /usr/lib64/

4. 情况四

能找到 .so 文件,但不符合命名规则,创建软链接即可。例如:libasound.so.2

ln -s libasound.so.2 libasound.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.65.1 /usr/lib/libboost_filesystem.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 /usr/lib/libboost_system.so

5. 情况五

需要用户编译生成的 .so 文件。

When you compile your program you must supply the path to the library; in g++ use the -L option:

编译c/c++程序,需要添加 -L 选项,才能生成 lib 链接库。

# c程序
g++ -L/path/foo/bar myprogram.cc -lxxx -o myprogram
# c++程序
g++ -L/home/user/myDir myprogram.cpp -lxxx -lxxx -o myprogram

6. 情况六

如果找不到 .so 文件,则下载安装。文章来源地址https://www.toymoban.com/news/detail-460680.html

  • google下载;
  • 百度下载;

6.1 示例一

sudo apt-get install libfoo-dev
# 如果apt-get安装失败,先添加apt源再安装
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev

6.2 示例二

unable to locate libjasper-dev
# 解决办法
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main" 
sudo apt update 
sudo apt install libjasper1 libjasper-dev

到了这里,关于【超详细教程】解决libxxx.so: cannot open shared object file: No file or directory的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【解决方法】libGL.so.1: cannot open shared object file: No such file or directory

    在配云端GPU服务器时,出现这个错误 解决方法 安装这个库即可 亲测有效 在Stack Overflow上有其他回答,当我试了无效 这边也提供给大家 1、在docker中出错 将以下行添加到您的 Dockerfile: 这些命令安装通常存在于本地计算机上的 cv2 依赖项,但可能会在您的 Docker 容器中丢失,

    2024年01月17日
    浏览(45)
  • “libGL.so.1: cannot open shared object file: No such file or directory“问题解决

    在使用Docker进行深度学习环境搭建时,安装opencv-python后出现此类报错,故寻找解决方法。 尝试安装opencv-python-headless,而不是opencv-python,适用于 Docker 等无界面系统。 opencv-python:这个存储库只包含OpenCV库的主要模块。 opencv-contrib-python : opencv-contrib-python 库包含主要模块与

    2024年02月14日
    浏览(50)
  • 解决:ImportError: libcudart.so.10.2: cannot open shared object file: No such file or directory.

    ImportError: libcudart.so.10.2: cannot open shared object file: No such file or directory 看官网 https://pytorch-geometric.readthedocs.io/en/latest/notes/installation.html Installation via Anaconda Update: You can now install PyG via Anaconda for all major OS/PyTorch/CUDA combinations 🤗 Given that you have PyTorch = 1.8.0 installed, simply run conda

    2024年02月11日
    浏览(41)
  • 报错解决:libcudart.so.10.2: cannot open shared object file: No such file or directory

    原因:所用cuda版本为11.5,在/usr/local/cuda-11.5/lib64目录中确实没有libcudart.so.10.2这个文件 解决方法:在官网https://developer.nvidia.com/cuda-10.2-download-archive?target_os=Linuxtarget_arch=x86_64target_distro=Ubuntutarget_version=1804target_type=runfilelocal按 Base Installer 安装cuda10.2,参考https://www.nhooo.com/note/

    2024年02月02日
    浏览(34)
  • ubantu libssl.so.1.1: cannot open shared object file

    libssl.so.1.1: cannot open shared object file 使用 Ubuntu 22.04 时,有时候会遇到如下错误 error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory 这是因为Ubuntu 22.04 默认使用的是 openssl3.0 ,但是大多为 Ubuntu 生成的可执行文件依赖 openssl 1.1 安装Openssl 1.1 我们

    2024年02月04日
    浏览(38)
  • ImportError: libXrender.so.1: cannot open shared object file: No such file or directory(无sudo权限解决问题)

    目录 一、问题描述 二、问题分析 三、问题解决 1、尝试用sudo管理员方式解决 2、没有管理员(sudo)权限,终端输入 小结: 安装好opencv-python之后,在服务器上运行代码报错,如下: opencv依赖包不全,python缺少共享库 1、尝试用sudo管理员方式解决 在当前用户有 sudo权限 情况

    2024年02月13日
    浏览(47)
  • libtorch_cuda_cu.so: cannot open shared object file

    运行时报错: (1)环境中libtorch_cuda_cu.so文件: 不存在 red {不存在} 不存在 mmcv的版本和torch版本不一致 [mmcv官网: PyTorch 和 CUDA 版本要求] [mmcv官网: 其他版本PyTorch ] 找对应版本torch 并重装

    2024年02月12日
    浏览(45)
  • Linux安装Mysql报错:libtinfo.so.5: cannot open shared object file

            我在Linux上安装Mysql 8.0,准备启动的时候遇到了如标题所示的错误: mysql: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory         大致意思是系统找不到 libtinfo.so.5,也就是缺少这个依赖而无法启动。         首先尝试用

    2023年04月14日
    浏览(49)
  • ImportError: libGL.so.1: cannot open shared object file: No such file or dir...解决Python import cv2报错

    在不联网的服务器上的Docker容器内运行Python程序,Python版本是3.8版本。安装的opencv-python是这一版: opencv_python-4.7.0.68-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 程序部分 import cv2 出现报错:ImportError: libGL.so.1: cannot open shared object file: No such file or directory 具体如下: 出现这种情

    2024年02月13日
    浏览(58)
  • mysql启动时报错:error while loading shared libraries: libncurses.so.5: cannot open shared object file

    今天由于项目的需要,特地在redhat9中安装了一套mysql5.7的数据库。前期在安装和配置的过程中没有什么问题,但是在启动mysql的时候报了一个错,报错内容为: 根据报错内容可以看出,是因为在启动mysql的时候加载了libtinfo.so.5库文件。此时我们可以查看redhat9系统中是否存在改

    2024年02月12日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包