在Linux环境执行程序时经常会遇到提示程序依赖动态库.so文件不存在的情况,出现报错"error while loading shared libraries: XXXX.so.XX: cannot open shared object file: No such file or directory"信息。遇到这种问题如何解决?本文主要讲述如下内容:

(1)ldd命令的语法和使用方法。如果出现动态库报错通常都是用这个命令执行查看一下。

(2)rpm命令使用。包括rpm命令查询、安装、卸载相关rpm软件包。

(3)ldconfig命令和相关环境变量。

(4)动态库缺失问题解决的过程。

1、ldd 打印可执行程序依赖动态库列表

(1)ldd基础语法

(2)ldd使用实例

主要就是ldd + 可执行程序名或者ldd `which 程序名`,如ldd `which cp`。如果是全部查看当前目录下文件。可以使用ldd *

说明:“=>”左边表示该程序需要连接的共享库.so 名称,右边表示从共享库.so在Linux文件系统中的具体位置。默认情况下,/etc/ld.so.conf 文件中包含有默认的共享库搜索路径。

2、ldconfig 动态链接库管理命令

ldconfig主要作用是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库,从而创建出动态装入程序(ld.so)所需的连接和缓存文件,缓存文件默认为 /etc/ld.so.cache

(1)ldconfig基本语法

ldconfig [-v|--verbose] [-p|--print-cache] [-?|--help|--usage] path...

选项说明:

-v或--verbose : 显示正在扫描的目录及搜索到的动态链接库,还有它所创建的连接的名字;

-p或--print-cache : 打印出当前缓存文件所保存的所有共享库的名字;

(2)lddconfig使用方法

a、直接执行 lddconfig。用于在/etc/ld.so.conf新增一行待写入高速缓存当中的动态函数库。

   b、lddconfig -p。列出目前的所有函数库数据内容(/etc/ld.so.cache)

3、rpm软件包管理命令

  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. Vendor: CentOS Release : Build Date: Sun Dec :: AM CST Install Date: Sat May :: PM CST Build Host: builder6 Group : System Environment/Base Source RPM: logrotate-3.7.-.src.rpm

  rpm -qf 动态库 输出安装的软件名称

[root@www ~]# rpm -qf /bin/sh
bash-3.2-.el5 --> 说明sh文件是通过安装bash-3.2-.el5获取。

(4)rpm卸载软件包

rpm -e package_name 卸载软件包。

rpm -e package_name --nodeps --force 强制卸载软件包。

4、cannot open shared object file解决步骤

这里描述一下分析思路。因为没有linux服务器,所以描述中的例子是自己构造的。但不影响理解。

(1)在服务器A上执行程序执行ldd 可执行程序。输出结果如下

linux-vdso.so. => (0x00007fff48ff0000)
libcrypt.so. => /lib64/libcrypt.so. (×)
libpcre.so.1 => not found
libssl.so. => /lib64/libssl.so. (×)
libcrypto.so. => /lib64/libcrypto.so. (×)
libdl.so. => /lib64/libdl.so. (×)

(2)在正常可以执行该程序的服务器B上,执行ldd 可执行程序。显示如下:

linux-vdso.so. => (0x00007fff48ff0000)
libcrypt.so. => /lib64/libcrypt.so. (×)
libpcre.so.1 => /lib64/libpcre.so.1
libssl.so. => /lib64/libssl.so. (×)
libcrypto.so. => /lib64/libcrypto.so. (×)
libdl.so. => /lib64/libdl.so. (×)

从这里,我们可以知道服务器A上/lib64目录下由于缺少libpcre.so.1文件导致程序执行报错提示缺少动态库。下一步就是开始想办法安装libpcre.so.1文件。这里有三种解决方法供参考,一种是安装libpcre.so.1对应的软件,一种是获取libpcre.so.1库文件并放置在 /lib64目录下。最后一种是获取libpcre.so.1库文件库文件并上传至服务器A任意目录下上并设置LD_LIBRARY_PATH变量

方法一:获取软件并设置LD_LIBRARY_PATH变量方法。如下:

Step1:从服务器B上下载libpcre.so.1对应软件,上传至服务器A上任意目录下。如/opt。

Step2:设置LD_LIBRARY_PATH变量。执行export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt。说明:LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。

Step3:重新执行程序,问题解决。

方法二:获取软件并放置指定目录下。如下:

Step1:从服务器B上下载libpcre.so.1对应软件,上传至服务器A上的/lib64目录下。/lib64为步骤(2)中查出缺失文件的目录。

Step2:重新执行程序,问题解决。

方法三:安装libpcre.so.1对应的软件方法如下:

Step1:在服务器B上执行rpm -qf /lib64/libpcre.so.1。

[root@www ~]# rpm -qf /lib64/libpcre.so.1

libpcre-3.2-.el5 --> 说明libpcre.so.1文件是通过安装libpcre-3.2-.el5获取。

Step2:查看Linux服务器系统版本,获取对应的镜像包,从而获取libpcre-3.2-21.el5.rpm安装软件

Step3:执行rpm -ivh libpcre-3.2-21.el5.rpm安装。

Step4:重新执行程序,问题解决。

Linux上error while loading shared libraries问题解决方法的更多相关文章

  1. Linux从error while loading shared libraries: libxxx.so.x 错误的常规解决思路看程序与动态库的关系

    出现这类错误的原因通常是动态库无法被加载,本文介绍了常规的解决方案,适用多种情况: 创作不易,如果本文帮到了您: 如果本文帮到了您,请帮忙点个赞

  2. Linux中error while loading shared libraries错误解决办法

    默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,通常通过源码包进行安装时,如果不指定--prefix,会将库安装在/usr/local/lib目录下:当运行程序需要链接动态库 ...

  3. 解决 Linux error while loading shared libraries: cannot open shared object file: No such file or directory

    安装最新版本Emqtt,参照官方文档安装后,执行报错: Linux error while loading shared libraries libsctp.so.1: cannot open sha ...

  4. linux使用wkhtmltopdf报错error while loading shared libraries:

    官网提示 linux需要这些动态库.depends on: zlib, fontconfig, freetype, X11 libs (libX11, libXext, libXrender) 在li ...

  5. 【转】linux中执行外部命令提示" error while loading shared libraries"时的解决办法

    今天在Centos下编译kapar 后执行时出错,老说: [root@dc01 ~]# kapar kapar: error while loading shared libraries: libsc ...

  6. 【linux排错】"error while loading shared libraries: xxx.so.x" 错误的原因和解决办法

    一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: lcw: error : cannot open shared object file: No such file ...

  7. Cloning EBS from Linux 5 to Linux 6 Fails: "Error While Loading Shared Libraries: libclntsh.so.10.1

    SYMPTOMS    During clone Oracle Applications R12 from Linux 5 to Linux 6 the following error occurs ...

  8. linux下报错:error while loading shared libraries

    linux执行bin程序报: error while loading shared libraries:libncurses.so.5: cannot open shared object file: ...

  9. C++.Linux下redis编程:error while loading shared libraries: libhiredis.so.0.13

    编译 sudo gcc -o sltest01 sltest01.c -L/usr/local/lib/ -lhiredis 运行 sudo ./sltest01 编译成功后运行报错信息: ./slt ...

随机推荐

  1. shell通配符, 变量, shell作用域

    1. 指定格式输出当前时间: echo `date +%Y%m%d`  # 注意使用反引号, +号后面不要有空格 反引号中的东西会被当做命令来执行, 并输出执行的结果 2. $uid用于判断当前是否是 ...

  2. python--基础知识点梳理(二)面向对象

    面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定在一起,进行封装,优点:快速高效 ,减少代码重写 面向对象三大特性:封装.继承.多态 # 封装的意义,隐藏实现细节 将属性和方法放到一起 ...

  3. 使用openpyxl模块进行封装,高效处理excel测试数据

    from openpyxl import load_workbook from scripts.handle_config import conf from scripts.constants imp ...

  4. PHP】获取客户端(浏览器)信息、获取客户端系统信息、获取服务器信息

    * 获取客户端浏览器信息 * @param null * @author https://blog.jjonline.cn/phptech/168.html * @return string */ f ...

  5. DedeCMS V5.7 SP2后台代码执行漏洞复现(CNVD-2018-01221)

    dedeCMS  V5.7 SP2后台代码执行漏洞复现(CNVD-2018-01221) 一.漏洞描述 织梦内容管理系统(Dedecms)是一款PHP开源网站管理系统.Dedecms V5.7 SP2 ...

  6. Java开发桌面程序学习(一)——JavaFx+Jfoenix初始以及搭建

    Java开发桌面程序学习(一)--JavaFx+Jfoenix初始以及搭建 前言 想做一个Java的桌面程序,但是,使用原生的Swing感觉又十分麻烦,那个布局都是拿代码设置,看着十分的乱,偶然的情况 ...

  7. sql server pivot

    SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[YearSalary]( [year] [int] NULL, ...

  8. go-gtk环境配置

    go-gtk环境配置(用于go的图形化界面) 弄了一天,终于把这个环境给搭建好了,差不多就是安装msys2->安装gtk的各个版本->安装mingw(我原来装有但不影响,因为重复了,环境变 ...

  9. java基础第十四篇之Map

    一,Map集合的特点: *  * 1.Map集合和Collection集合,没有关系 *  * 2.Map集合的元素是成对存在(夫妻关系) *         Collection集合的元素是独立存在 ...

  10. JS基础语法---一元运算符

        *    ++  -- 都是运算符     *    ++ 和 --  可以分为:前+ 和后+  and   前- 和后-          *  如果++在后面:如: num++ +10参与 ...