dlopen用法


1. 包含頭文件  #include<dlfcn.h>

2. 函數定義 void * dlopen(const char* pathName, int mode);

pathName 指的是db文件或listDB.so文件在實機環境中的位置, mode指的是打開數據庫的模式

mode在linux下,按功能有以下幾種

解析方式:

RTLD_LAZY:暫緩決定,在dlopen返回前,對於動態庫中的未定義的符號不執行解析(只對函數引用有效,對於變量引用總是立即解析)

RTLD_NOW:立即決定,在dlopen返回前,解析出所有未定義的符號,如果解析不出來,在dlopen會返回NULL,錯誤為 undefined symbol:XXX...

作用范圍:

RTLD_GLOBAL: 動態庫中定義的符號可被其后打開的其他庫重定位

RTLD_LOCAL: 與RTLD_GLOBAL作用相反,動態庫中定義的符號不能被其后打開的其他庫重定位。如果沒有指明是RTLD_GLOBAL還是RTLD_LOCAL,那么

默認是RTLD_LOCAL。

作用方式:

RTLD_NODELETE:在dlclose()期間不卸載庫,並且在以后使用dlopen()重新加載庫時不初始化庫中的靜態變量。這個flag不是POSIX-2001標准。

RTLD_NOLOAD: 不加載庫,可用於測試庫是否已經加載(dlopen()返回NULL說明未加載,否則說明加載),也可用於改變已加載庫的flag,

如:先前加載庫的flag為RTLD_LOCAL,用dlopen(RTLD_NOLOAD|RTLD_GLOBAL)后flag將變成RTLD_GLOBAL.這個flag不是POSIX-2001標准

RTLD_DEEPBIND:在搜索全局符號前先搜索庫內的符號,避免同名符號的沖突,這個flag不是POSIX-2001標准

 

3. 返回值void*,如果成功則返回引用這個數據庫的句柄,如果失敗則返回NULL

編譯時要加入 -ldl(指定dl庫)

ey:gcc test.c -o test -ldl

 


免責聲明!

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



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