闡述Linux動態(tài)庫的顯式調(diào)用
十年的發(fā)展,Linux系統(tǒng)已經(jīng)趕上了微軟,于是很多人開始學習Linux時,學習Linux,你可能會遇到動態(tài)庫的顯式調(diào)用,這里將介紹動態(tài)庫的顯式調(diào)用的解決方法,在這里拿出來和大家介紹下。
顯式調(diào)用的含義是代碼出現(xiàn)庫文件名,用戶需要自己去打開和管理庫文件。其要點為:
⑴把dlfcn.h系統(tǒng)頭文件包含進來
⑵用dlopen函數(shù)打開庫文件,并指定打開方式
dllope的的第一個參數(shù)為共享庫的名稱,將會在下面位置查找指定的共享庫。
①環(huán)境變量LD_LIBRARY_PATH列出的用分號間隔的所有目錄。
②文件/etc/ld.so.cache中找到的庫的列表,由ldconfig命令刷新。
③目錄usr/lib。
④目錄/lib。
⑤當前目錄。
第二個參數(shù)為打開共享庫的方式。有兩個取值
①RTLD_NOW:將共享庫中的所有函數(shù)加載到內(nèi)存
②RTLD_LAZY:會推后共享庫中的函數(shù)的加載操作,直到調(diào)用dlsym()時方加載某函數(shù)
⑶用dlerror()函數(shù)測試是否打開成功,并進行錯誤處理;
⑷用dlsym獲得函數(shù)地址,存放在一個函數(shù)指針中
⑸用獲得的函數(shù)指針進行函數(shù)調(diào)用。
⑹程序結(jié)束時用dlclose關閉打開的動態(tài)庫,防止資源泄露。
⑺用ldconfig工具把動態(tài)庫的路徑加到系統(tǒng)庫列表中
1、編寫測試文件
- //main.c 測試動態(tài)庫顯式調(diào)用的程序
- #include<dlfcn.h> //用于動態(tài)庫管理的系統(tǒng)頭文件
- #include "myalib.h"http://要把函數(shù)的頭文件包含進來,否則編譯時會報錯
- int main(int argc,char* argv[])
- {
- //聲明對應的函數(shù)的函數(shù)指針
- void (*pTest)();
- //加載動態(tài)庫
- 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;
- }
- //獲取函數(shù)的地址
- pTest = dlsym(pdlHandle, "test");
- pszErr = dlerror();
- if(pszErr != NULL)
- {
- printf("%s\n", pszErr);
- dlclose(pdlHandle);
- return -1;
- }
- //實現(xiàn)函數(shù)調(diào)用
- (*pTest)();
- //程序結(jié)束時關閉動態(tài)庫
- dlclose(pdlHandle);
- return 0;
- }
2、編譯測試文件
使用-ldl選項指明生成的對象模塊需要使用共享庫
gcc -o main -ldl main.c
執(zhí)行完后就生成了一個main文件
3、執(zhí)行測試程序
執(zhí)行 ./main
輸出
test
說明成功。這就是Linux動態(tài)庫的顯式調(diào)用的介紹。
【編輯推薦】