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;