在Linux环境执行程序时常常会遇到提示程序依赖动态库.so文件不存在的状况,出现报错"error while loading shared libraries: XXXX.so.XX: cannot open shared object file: No such file or directory"信息。遇到这种问题如何解决?开始以前先把分析过程当中会用到ldd、rpm、ldconfig指令以及相关的环境变量、配置文件作个基本介绍。node
(1)ldd基础语法linux
(2)ldd使用实例缓存
主要就是ldd + 可执行程序名或者ldd `which 程序名`,如ldd `which cp`。若是是所有查看当前目录下文件。可使用ldd *bash
说明:“=>”左边表示该程序须要链接的共享库.so 名称,右边表示从共享库.so在Linux文件系统中的具体位置。默认状况下,/etc/ld.so.conf 文件中包含有默认的共享库搜索路径。服务器
ldconfig主要做用是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态连接库,从而建立出动态装入程序(ld.so)所需的链接和缓存文件,缓存文件默认为 /etc/ld.so.cache。函数
(1)ldconfig基本语法ui
ldconfig [-v|--verbose] [-p|--print-cache] [-?|--help|--usage] path...spa
选项说明:code
-v或--verbose : 显示正在扫描的目录及搜索到的动态连接库,还有它所建立的链接的名字;blog
-p或--print-cache : 打印出当前缓存文件所保存的全部共享库的名字;
(2)lddconfig使用方法
a、直接执行 lddconfig。用于在/etc/ld.so.conf新增一行待写入高速缓存当中的动态函数库。
b、lddconfig -p。列出目前的全部函数库数据内容(/etc/ld.so.cache)
rpm(RedHat Package Manager)用于安装、更新、卸载系统软件。rpm基本使用场景以下:
(1)rpm安装
rpm -ivh package_name 正常安装,若是缺乏依赖文件时会安装失败
rpm -ivh --nodeps --force package_name 强制安装,即便缺乏依赖文件。
(2)rpm升级或更新软件
rpm -Uvh/Fvh package_name 升级或更新软件
-Uvh 后面接的软件即便没有安装过,则系统将予以直接安装; 若后面接的软件有安装过旧版,则系统更新至新版;
-Fvh 若是后面接的软件幵未安装,则该软件不会被安装;若后面接的软件有安装过旧版,则系统更新至新版。
(3)rpm查询软件包
重点再说一下本文描述中会用到的-qf/-qi参数。目的是指望经过这两个参数去获取缺失动态库能够经过安装哪个软件能够获取。
rpm -qi 动态库名称。根据输出结果中的Source RPM能够获取安装的软件名称
[root@www ~]# rpm -qi logrotate
Name : logrotate Relocations: (not relocatable) Version : 3.7.4 Vendor: CentOS Release : 8 Build Date: Sun 02 Dec 2007 08:38:06 AM CST Install Date: Sat 09 May 2009 11:59:05 PM CST Build Host: builder6 Group : System Environment/Base Source RPM: logrotate-3.7.4-8.src.rpm
rpm -qf 动态库 输出安装的软件名称
[root@www ~]# rpm -qf /bin/sh
bash-3.2-21.el5 --> 说明sh文件是经过安装bash-3.2-21.el5获取。
(4)rpm卸载软件包
rpm -e package_name 卸载软件包。
rpm -e package_name --nodeps --force 强制卸载软件包。
这里描述一下分析思路。由于没有linux服务器,因此描述中的例子是本身构造的。但不影响理解。
(1)在服务器A上执行程序执行ldd 可执行程序。输出结果以下
linux-vdso.so.1 => (0x00007fff48ff0000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0×0000003065800000)
libpcre.so.1 => not found
libssl.so.6 => /lib64/libssl.so.6 (0×0000003067000000)
libcrypto.so.6 => /lib64/libcrypto.so.6 (0×0000003066400000)
libdl.so.2 => /lib64/libdl.so.2 (0×0000003063000000)
(2)在正常能够执行该程序的服务器B上,执行ldd 可执行程序。显示以下:
linux-vdso.so.1 => (0x00007fff48ff0000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0×0000003065800000)
libpcre.so.1 => /lib64/libpcre.so.1
libssl.so.6 => /lib64/libssl.so.6 (0×0000003067000000)
libcrypto.so.6 => /lib64/libcrypto.so.6 (0×0000003066400000)
libdl.so.2 => /lib64/libdl.so.2 (0×0000003063000000)
从这里,咱们能够知道服务器A上/lib64目录下因为缺乏libpcre.so.1文件致使程序执行报错提示缺乏动态库。下一步就是开始想办法安装libpcre.so.1文件。
(3)在服务器B上执行rpm -qf /lib64/libpcre.so.1。
[root@www ~]# rpm -qf /lib64/libpcre.so.1 libpcre-3.2-21.el5 --> 说明libpcre.so.1文件是经过安装libpcre-3.2-21.el5获取。
(4)查看Linux服务器系统版本,获取对应的镜像包,从而获取libpcre-3.2-21.el5.rpm安装软件
(5)执行rpm -ivh libpcre-3.2-21.el5.rpm安装。
(6)从新执行程序,问题解决。