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