dlfcn.h : Linux動態庫的顯式調用


dlfcn.h : Linux動態庫的顯式調用[1]

學習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 argcchar* 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

說明成功。

原文:

http://hi.baidu.com/lzhsdly/item/2bfd52e435cde4aac00d75f0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM