目的
为了方便在windows平台或者mac、osx平台上调用动态库,封装一个C++基础模板类,实现动态库加载,函数获取以及直接调用,直接调用时只要传入函数名成和参数即可
因为要兼容windows 和mac 平台我们定义两个宏做编译区分
defined(OS_WIN)
defined(OS_MACOSX)
关键知识点
windows 加载动态库使用到的函数 LoadLibraryExW,GetProcAddress,FreeLibrary
macosx 加载动态库使用到的函数 dlopen,GetProcAddress,dlclose
可变参数模板函数
std::result_of<std::function(Args…)>::type
std::forward(args)…
代码
三个文件shared_library.h shared_library.cc shared_library.mm
头文件
class SharedLibrary
{
public:
SharedLibrary();
~SharedLibrary();
public:
//加载动态库dll或者dylib
bool Load(std::string str_utf8_dllfilepath);
//获取动态库中的函数指针
//通过函数模板适应所以函数类型
template <typename T>
T* GetFunction(const std::string _funcName)
{
T* _funcPtr = nullptr;
#if defined(OS_WIN)
//windows 中通过GetProcAddress 获取函数地址
auto _ptr = GetProcAddress((HMODULE)libraryHandle_, _funcName.c_str());
_funcPtr = (T*)_ptr;
#endif
#if defined(OS_MACOSX)
//Mac dlsym 获取函数地址
auto _ptr = (T*)dlsym(libraryHandle_, _funcName.c_str());
_funcPtr = (T*)_ptr;
const