一、参考资料

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 --verbosegcc -lxxx --verboselocate 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) 指令,检查动态库依赖关系。

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

四、问题分析

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 运行成功

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


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 文件,则下载安装。

  • 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相关推荐

  1. 安装64位Oracle 10g超详细教程

    安装64位Oracle 10g超详细教程 1. 安装准备阶段 1.1 安装Oracle环境 经过上一篇博文的过程,已经完成了对Linux系统的安装,本例使用X-Manager来实现与Linux系统的连 ...

  2. 二进制安装部署 4 kubernetes集群---超详细教程

    二进制安装部署kubernetes集群---超详细教程 前言:本篇博客是博主踩过无数坑,反复查阅资料,一步步搭建完成后整理的个人心得,分享给大家~~~ 本文所需的安装包,都上传在我的网盘中,需要的可以 ...

  3. 【超详细教程】使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结...

    [超详细教程]使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结 原文 http://www.cnblogs.com/liuxianan/ ...

  4. mysql 8.0.22_最新版MySQL 8.0.22下载安装超详细教程(Windows 64位)

    前言 前几天下载安装了最新版的MySQL 8.0.22,遇到了不少问题,参考了一些方法,最终得以解决.今天将自己的安装过程记录下来,希望对各位有所帮助. 一.MySQL 8.0.22官网下载 点击进入 ...

  5. 【K8S实战】-超详细教程(二)

    [K8S实战]-超详细教程(二) 环境这块的这里我就不过多描述了,需要了解的可以看这篇文章[k8s搭建(超详细,保姆级教程)]. 1.Deployment Deployment其他功能我上一篇文章已写 ...

  6. Java并发编程Future超详细教程

    非原创,自己保存学习用,传播请参考原文. 原文链接:Java并发编程Future超详细教程 前言 创建线程有几种方式?这个问题的答案应该是可以脱口而出的吧 继承 Thread 类实现 Runnable ...

  7. Git安装教程(Windows安装超详细教程)

    Git安装教程(Windows安装超详细教程)  weir_will 关注 0.9 2017.10.08 00:59* 字数 728 阅读 17955评论 8喜欢 41 2018年4月14日更新  更 ...

  8. 大数据平台Ambari2.7.4+HDP3.1.4安装(超详细教程)

    大数据平台Ambari2.7.4+HDP3.1.4安装(超详细教程) Ambari2.7.4+HDP3.1.4是最后一个免费版本,新版本需要授权. 因工作需要,安装大数据集群,了解到Ambari属于A ...

  9. 大疆无人机空三建模干货分享(大疆智图集群建模超详细教程)

    Part 01 大疆无人机空三建模干货分享(大疆智图集群建模超详细教程) 大疆智图集群简介 大疆在今年5月推出的智图3.0.0及以上版本中加入了集群功能,有集群版许可的用户可以使用此功能.智图集群是由 ...

最新文章

  1. Android Studio下的目录结构
  2. QQ web api
  3. modelsim do文件仿真
  4. linux下C++动态链接C++库示例详解
  5. retrofit 会请求两次_Retrofit2+Rxjava-Rxjava2.x-篇二-依次执行多个请求-flatMap/map
  6. 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡 期望DP+高斯消元
  7. 在Spring Boot中加载初始化数据
  8. 医疗人工智能市场有多大?
  9. [Java] Java常见错误
  10. StackExchange.Redis 官方文档(五) Keys, Values and Channels
  11. NYOJ760-See LCS again,有技巧的暴力!
  12. java 判断两个时间相差的天数
  13. 黑马程序员-银行业务调度系统
  14. 用手机写代码,在网页中写代码
  15. 《信心——是什么?导致什么?》_司布真
  16. UiPath认证流程
  17. CUMT-CTF第二次双月赛Writeup
  18. 漏电开关跳闸,把火线和零线对换就不跳了,这是什么原因?
  19. 磁盘IOPS和带宽(throughput)
  20. GPU 编程 CPU 异同点_分析师:英特尔(INTC.US)GPU不会构成威胁

热门文章

  1. Vue router-view 路由无缝切换动画
  2. h5首页加载慢_近期iOS打开H5页面非常慢的原因
  3. 《android开发艺术探索》读书笔记(二)--IPC机制
  4. vue2项目启动控制台打印输出
  5. LWIP学习笔记(7)ICMP协议
  6. HTB-Armageddon
  7. 数据结构(C语言版)严蔚敏---图的操作的相关代码
  8. 数据结构-景区信息管理系统
  9. 【python画图】使用python画折线图、柱状图
  10. GRE填空:从菜鸟到老鸟的复习规划