Linux下無法使用動態鏈結庫的解決方法

2021-09-27 11:36:47 字數 1210 閱讀 8307

本次實驗平台:

【debian9】

gcc version 6.3.0 20170516 (debian 6.3.0-18+deb9u1)

gnu ld (gnu binutils for debian) 2.28

最近在使用c語言造輪子,夯實基礎。將常用演算法封裝成函式放入庫中,供可執行程式呼叫。這裡首先試驗了靜態鏈結,無問題。試驗使用動態鏈結時,出現無法找到檔案的錯誤。

以參考專案為例,**可通過編譯及鏈結,但在執行時,提示如下:

./teststring: error while loading shared libraries: libplanc.so: cannot open shared object file: no such file or directory

說明程式無法找到正確的動態庫。

此時使用系統提供的ldd指令碼,檢視共享庫的依賴關係,如下圖所示,提示無法找到libplanc.so

再用readelf檢視可執行程式的動態段,如下:

此處註冊了libplanc.so動態庫,但是並沒有指定查詢目錄,那麼在執行此可執行檔案時,系統只會在預設的路徑查詢libplanc.so庫,顯然是找不到的。那麼問題至此已經明確,解決方法只需要在鏈結階段,設定鏈結器搜尋指定目錄,就可以正常執行。

在makefile中,加入如下指令:

-wl,-rpath=

../../src

編譯以後,再次使用readelf檢視可執行程式的動態段,如下:

可見library runpath中指定了搜尋目錄。

再次使用指令碼ldd檢視依賴關係,如下:

至此,問題解決。

參考資料

1.2.man ld

Linux下動態鏈結庫的使用

linux下的靜態鏈結庫,做起來比較容易,只要將目標檔案用ar打包就可以,下面寫一下動態鏈結庫的製作和使用方法,完全是根據個人理解和經驗總結,有不對的地方還請大家指正。動態鏈結庫的生成 上與寫靜態鏈結庫沒什麼區別,主要是在編譯時,以兩個檔案舉例 mylib.h void print mylib.c ...

Linux下動態鏈結庫和靜態鏈結庫

第一部分 編譯過程 預處理過程,負責標頭檔案展開,巨集替換,條件編譯的選擇,刪除注釋等工作。gcc e表示進行預處理。編譯過程,負載將預處理生成的檔案,經過詞法分析,語法分析,語義分析及優化後生成彙編檔案。gcc s表示進行編譯。彙編,是將彙編 轉換為機器可執行指令的過程。通過使用gcc c或者as...

Linux下動態鏈結庫呼叫

2014 11 01 10 39 3人閱讀收藏 編輯 刪除2013 06 08 20 52 48 分類 整合開發環境相關 舉報 字型大小訂閱 linux下的靜態鏈結庫,做起來比較容易,只要將目標檔案用ar打包就可以,下面寫一下動態鏈結庫的製作和使用方法,完全是根據個人理解和經驗總結,有不對的地方還請...