本次實驗平台:最近在使用c語言造輪子,夯實基礎。將常用演算法封裝成函式放入庫中,供可執行程式呼叫。這裡首先試驗了靜態鏈結,無問題。試驗使用動態鏈結時,出現無法找到檔案的錯誤。【debian9】
gcc version 6.3.0 20170516 (debian 6.3.0-18+deb9u1)
gnu ld (gnu binutils for debian) 2.28
以參考專案為例,**可通過編譯及鏈結,但在執行時,提示如下:
./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打包就可以,下面寫一下動態鏈結庫的製作和使用方法,完全是根據個人理解和經驗總結,有不對的地方還請...