天天看點

Linux動态庫的顯式調用

顯式調用的含義是代碼出現庫檔案名,使用者需要自己去打開和管理庫檔案。其要點為:

⑴把dlfcn.h系統頭檔案包含進來

⑵用dlopen函數打開庫檔案,并指定打開方式

dllope的的第一個參數為共享庫的名稱,将會在下面位置查找指定的共享庫。

①環境變量LD_LIBRARY_PATH列出的用分号間隔的所有目錄。

②檔案/etc/ld.so.cache中找到的庫的清單,由ldconfig指令重新整理。

③目錄usr/lib。

④目錄/lib。

⑤目前目錄。

第二個參數為打開共享庫的方式。有兩個取值

①RTLD_NOW:将共享庫中的所有函數加載到記憶體

②RTLD_LAZY:會推後共享庫中的函數的加載操作,直到調用dlsym()時方加載某函數

⑶用dlerror()函數測試是否打開成功,并進行錯誤處理;

⑷用dlsym獲得函數位址,存放在一個函數指針中

⑸用獲得的函數指針進行函數調用。

⑹程式結束時用dlclose關閉打開的動态庫,防止資源洩露。

⑺用ldconfig工具把動态庫的路徑加到系統庫清單中

1、編寫測試檔案

//main.c 測試動态庫顯式調用的程式   

#include<dlfcn.h>  //用于動态庫管理的系統頭檔案     

#include "myalib.h"//要把函數的頭檔案包含進來,否則編譯時會報錯   

int main(int argc,char* argv[])   

{   

//聲明對應的函數的函數指針   

void (*pTest)();   

//加載動态庫   

void *pdlHandle = dlopen("libtest.so", RTLD_LAZY);   

//錯誤處理   

if(pdlHandle == NULL ){   

printf("Failed load library\n");   

return -1;   

}   

char* pszErr = dlerror();   

if(pszErr != NULL)   

{   

printf("%s\n", pszErr);   

return -1;   

}   

//擷取函數的位址   

pTest = dlsym(pdlHandle, "test");   

pszErr = dlerror();   

if(pszErr != NULL)   

{   

printf("%s\n", pszErr);   

dlclose(pdlHandle);   

return -1;   

}   

//實作函數調用   

(*pTest)();   

//程式結束時關閉動态庫   

dlclose(pdlHandle);   

return 0;     

}

2、編譯測試檔案

使用-ldl選項指明生成的對象子產品需要使用共享庫

gcc -o main -ldl main.c

執行完後就生成了一個main檔案

3、執行測試程式

執行 ./main

輸出

test

說明成功。

這就是Linux動态庫的顯式調用的介紹。

繼續閱讀