動態庫的調用方式
在 Linux 中,動態庫(.so文件)的調用方式主要有兩種:編譯時鏈接(隱式調用)和運行時加載(顯式調用)。
一、編譯時鏈接(隱式調用)
這種方式在編譯階段就指定動態庫,程序啟動時會自動加載依賴的動態庫,適用于已知庫路徑和接口的場景。
- 步驟 1:創建動態庫源文件
首先實現一個簡單的動態庫,包含兩個接口函數。
- 步驟 2:編譯生成動態庫
使用g++編譯生成.so文件:
# 編譯為位置無關代碼(-fPIC),生成動態庫(-shared)
g++ -fPIC -shared mylib.cpp -o libmylib.so
生成libmylib.so動態庫(Linux 動態庫命名規范:lib+庫名+.so)。
- 步驟 3:編寫調用動態庫的程序
- 步驟 4:編譯程序并鏈接動態庫
# -L. 表示在當前目錄查找動態庫,-lmylib 表示鏈接libmylib.so
g++ main.cpp -o main -L. -lmylib
+ 步驟 5:運行程序 運行前需確保系統能找到動態庫(否則會報 “找不到共享庫” 錯誤):
# 臨時指定動態庫搜索路徑(當前目錄)
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
#運行程序
./main
二、運行時加載(顯式調用)
這種方式不依賴編譯時鏈接,而是在程序運行中通過系統函數動態加載庫并調用接口,適用于庫路徑不確定或需要動態切換庫版本的場景(如插件系統)。
- 步驟 1:使用相同的動態庫
復用前面生成的libmylib.so(無需修改)。
- 步驟 2:編寫顯式調用的程序
通過dlopen、dlsym、dlclose等函數手動加載和調用動態庫。
- 步驟 3:編譯程序
顯式調用需要鏈接dl庫(動態加載系統庫)
g++ main_dl.cpp -o main_dl -ldl
- 步驟 4:運行程序
同樣需要指定動態庫路徑
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./main_dl
輸出結果與隱式調用相同。
三、兩種調用方式對比


浙公網安備 33010602011771號