Linux 環境:
1. 動態加載:頭文件 #include <dlfcn.h>
流程:(1)//獲取庫句柄
HANDLE hModule = dlopen(szPath, RTLD_LAZY);
(2)//獲取函數地址
typedef void(*Fun)(param1, param2,...);
Fun pFun = (Fun)dlsym(hModule, _MMT("需要引用的庫函數名"));
(3)//函數調用
pFun(param1, param2,...);
(4)//釋放庫句柄
dlclose(hModule);
hModule = NULL;
2.靜態加載:
流程: (1)編譯條件裏,依賴動態庫 LIBS +=
(2)調用庫函數之前,加載該動態庫。 dlopen 或者 Java 的 Load。
(3)可以直接調用庫函數了,像調用靜態庫的方式,不再需要 dlsym 獲取庫函數的地址。
(4)釋放步驟 (2) 裏的句柄。
顯式加載動態庫,除了調用 API: dlopen, Load,也可以直接把動態庫存放在系統目錄下,如 ./system/lib。
Windows 環境:
1. 動態加載:
流程:同 Linux 流程一樣,只是 API 不同。
(1)HANDLE hModule = ::LoadLibrary(szPath);
(2)Fun pFun = (Fun)GetProcAddress((HINSTANCE)pInfo->hModule, _MMT("需要引用的庫函數名"));
(3)pFun(param1, param2,...);
(4)FreeLibrary(hModule);
hModule = NULL;
2. 靜態加載:(1)引用對應的靜態庫 .a
(2)HANDLE hModule = LoadLobrary(szPath);
(3) 可以直接調用庫函數了,不再需要 GetProcAddress 獲取庫函數的地址。
(4)FreeLibrary(hModule);
hModule = NULL;