顯式調用的含義是代碼出現庫檔案名,使用者需要自己去打開和管理庫檔案。其要點為:
⑴把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動态庫的顯式調用的介紹。