天天看點

Linux上error while loading shared libraries問題解決方法

Linux上error while loading shared libraries問題解決方法

    在Linux環境執行程式時經常會遇到提示程式依賴動态庫.so檔案不存在的情況,出現報錯"error while loading shared libraries: XXXX.so.XX: cannot open shared object file: No such file or directory"資訊。遇到這種問題如何解決?開始之前先把分析過程中會用到ldd、rpm、ldconfig指令以及相關的環境變量、配置檔案做個基本介紹。

1、ldd 列印可執行程式依賴動态庫清單

(1)ldd基礎文法

Linux上error while loading shared libraries問題解決方法

(2)ldd使用執行個體

    主要就是ldd + 可執行程式名或者ldd `which 程式名`,如ldd `which cp`。如果是全部檢視目前目錄下檔案。可以使用ldd *

Linux上error while loading shared libraries問題解決方法

  說明:“=>”左邊表示該程式需要連接配接的共享庫.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  正常安裝,如果缺少依賴檔案時會安裝失敗

Linux上error while loading shared libraries問題解決方法

 rpm -ivh --nodeps --force package_name 強制安裝,即使缺少依賴檔案。

Linux上error while loading shared libraries問題解決方法

(2)rpm更新或更新軟體

 rpm -Uvh/Fvh package_name 更新或更新軟體

-Uvh 後面接的軟體即使沒有安裝過,則系統将予以直接安裝; 若後面接的軟體有安裝過舊版,則系統更新至新版;

-Fvh 如果後面接的軟體幵未安裝,則該軟體不會被安裝;若後面接的軟體有安裝過舊版,則系統更新至新版。

(3)rpm查詢

Linux上error while loading shared libraries問題解決方法

   重點再說一下本文描述中會用到的-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、cannot open shared object file解決步驟

  這裡描述一下分析思路。因為沒有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)重新執行程式,問題解決。

posted on 2019-05-29 08:44 代碼清潔工 閱讀(...) 評論(...) 編輯 收藏

繼續閱讀