在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)從新執行程序,問題解決。