Linux下,手動載入動態庫~~
咳咳,在自己寫的函式中載入一個動態庫。
----標頭檔案 #include<dlfcn.h>
有四位夥計: dlopen(),
dlsym(),
dlclose(),
dlerror().
接下來一一登場!
在編譯時要加入 -ldl : 如: gcc test.c -o test -ldl
1, dlopen() 使用指定模式,開啟指定的動態連結庫檔案,並返回一個控制代碼給呼叫程序,失敗的話返回NULL。
函式原型:
void * dlopen(const char* pathname, int mode);
pathname: 指定庫的路徑和名字。
mode: 開啟模式。有以下幾種:
a.解析方式:
RTLD_LAZY 暫緩決定,等有需要時再解出符號。
RTLD_NOW 立即決定,返回前解除所有為決定的符號。
b.作用範圍,可與解析方式通過"|"組合使用
RTLD_LOCAL 動態庫中定義的符號不能被其後開啟的其他庫重定位,預設為此。
RTLD_GLOBAL 動態庫中定義的符號可被其後開啟的其他庫重定位。
詳細的英文解釋:
http://www.9linux.com/dlsym.html
2, dlsym()呼叫使用dlopen()開啟的庫中的函式的地址。
函式原型:
void* dlsym(void* handle,const char* symbol);
handle是由dlopen開啟動態連結庫後返回的指標,symbol就是要求獲取的函式名稱,
返回值是void*,指向函式的地址,共呼叫使用。
3,dlclose() 關閉指定控制代碼的動態連線庫,只有當詞是動態連結庫的使用計數為0時,才會真正被系統解除安裝。
函式原型:
int dlclose(void* handle);
4,dlerror()當動態連結庫操作函式執行失敗時,dlerror可以返回出錯資訊,返回值為NULL時表示操作函式執行成功。
函式原型:
const char* dlerror(void);
一個例子: