動態庫的動態載入和靜態載入 Linux環境

2021-10-24 16:44:25 字數 1882 閱讀 3335

gcc -fpic -c math.c  -o math.o            //自行編寫他們的標頭檔案放在同一目錄下

gcc -fpic -c show.c -o show.o

gcc -shared math.o show.o -o libmath.so 為動態庫,lib***其中 *** 為動態庫的名字

export ld_library_path=$ld_library_path:.     //.表示當前目錄
gcc main.c libmath.so -o math              //生成math,執行./math 

或gcc main.c -l./ -lmath -o math

動態載入是在程式執行期間載入和解除安裝動態庫。linux中的dl庫實現庫的動態載入。最終鏈結時,使用-ldl

#include void *dlopen(const char *filename,int flag);

char *dlerror(void);

void *dlsym(void *handle,const char *symbol);

int dlclose(void *handle);

link with -ldl

void *dlopen(const char *filename,int flag);

--filename:如果有路徑,按照路徑載入;只有檔名時,根據ld_library_path環境變數去查詢

--flag:載入標誌(rtld_lazy:延遲載入,什麼時候真正使用,什麼時候載入;rtld_now:立即載入)

--返回值:成功返回動態庫的控制代碼,失敗返回null

void *dlsym(void *handle,const char *symbol);

--handle:動態庫的控制代碼

--symbol:函式名

int dlclose(void *handle);

--handle:動態庫控制代碼

char *dlerror(void);

--返回值:返回錯誤字串

#include#includetypedef int(*pfunc_call)(int,int);

typedef int(*pfunc_show)(int); //給函式指標定義乙個別名 pfunc_show = int(*)(int)

int main()

//獲取函式位址

pfunc_call add = (pfunc_call)dlsym(handle,"add");

if(add==null)

int(*show)(int)= dlsym(handle,"show"); //int(*show)(int) = pfunc_show

if(add==null) // 函式原型 int show(int)

show(add(9,5));

dlclose(handle);

return 0;

}

gcc dmain.c -ldl -o math
ar rc math.a math.o

gcc main.c -o main.o

gcc -o main2 main.o -l./ -lmath

VC 載入動態庫和靜態庫

靜態庫包括.lib和.h檔案,在工程中使用靜態庫分為3步 1在工程中加入靜態庫,有兩種方法 方法一 專案設定中引用.lib,project setting link object library modules中新增.lib 需要在tools options設定正確的引用路徑 方法二 在專案中直接加...

Apache模組動態載入和靜態載入

在 使用.configure 編譯的時候,如果不指定某個模組為動態,即沒有使用 enable mods shared module 或者enable module shared這個2 個中的乙個,那麼所有的預設模組為靜態。那麼何謂靜態?其實就是編譯的時候所有的模組自己編譯進 這個檔案中 我們啟動可以...

Apache模組動態載入和靜態載入

這裡我來解釋下什麼叫動態載入和靜態載入?說簡單,並用打比喻的方式來解釋.好比有兩個人a和m a代表apache,m代表module 要想讓a使用m的東西 乙個方法是把m的東西都放到a那裡去,a使用的時候就是現成的了 就是所謂的靜態編譯 還有乙個方法,就是告訴a,m的住址,當a要使用m的東西的時候,a...