unix/linux共享庫(動態庫)簡介
阿新 • • 發佈:2019-06-12
一、建立共享庫:
1.寫源程式 xxx1.c xxx2.c.../*.c(萬用字元方式)
2.編譯源程式,加-fpic生成.o檔案
gcc -c -fpic xxx1.c xxx2.c.../*.c(萬用字元方式)
3.生成共享庫檔案
gcc -shared xxx.o -o libxxx.so
4.提供標頭檔案,方便呼叫
二、使用共享庫
1.寫呼叫源程式 xxx.c
2.編譯源程式,生成.o檔案
3.連結共享庫檔案
gcc test.o -l xxx(共享庫去掉lib字首和.a字尾剩下的名字) -L . ----------{PATH}
如果作業系統支援環境變數LIBRARY_PATH,使用該環境變數可以省略-L
執行期間,動態載入共享庫,系統會自動查詢LD_LIBRARY_PATH環境變數中的路徑,確定共享庫的位置,如果找不到
共享庫檔案,程式會執行失敗。(靜態庫不需要)
三、顯式載入和使用共享庫
#include<dlfcn.h>
void *dlopen(const char *filename,int flag);
//filename:so檔名
//flag:開啟方式
//返回值:void *,表示開啟後的共享庫檔案指標
char *dlerror(void);
//檢查dlopen開啟共享庫是否成功
//返回空指標表示開啟成功
//返回非空字串表示開啟失敗,字串內容包含失敗原因
void *dlsym(void *hanlde,const char *symbol);
//hanlde,需要使用的共享庫地址,dlopen的返回值
//symbol,需要呼叫的函式名
//返回值:void *,使用時需要自行轉換為對應函式型別
int dlclose(void *handle);
//關閉共享庫,釋放記憶體
其中dlopen的引數flag的含義如下:
RTLD_LAZY:符號查詢時候才載入。(使用時載入到記憶體)
RTLD_NOW:馬上載入。(開啟即載入到內