动态库的动态加载在底层c运行库提供了三个函数 dlopen、dlsym、dlclose,非常简洁高效,但如果使用c++的方式,应该可以做到更好的易用性,或者更好的类型安全。
因此我们尝试了通过将动态库的导出方法通过定义类来固化,并且能使用c++模板来自动实现这些方法。
比如动态库memory.dll,包含了三个内存管理方法malloc,free,calloc,我们将这个库封装成了如下的Memory类:
struct Memory : DLL<Memory>
{
IMPORT(malloc, (void*(*)(size_t)));
IMPORT(free, (void(*)(void*)));
IMPORT(calloc, (void*(*)(size_t,size_t)));
};
通过这个Memory类,通过声明的方式固化了动态库导出函数信息,并且可以动态加载对应库并调用其方法了:
Memory::open("/usr/local/lib/memory.dll", RTLD_LAZY); //动态加载dll库
void *pBuff = Memory::malloc(1024); //调用动态库的导出方法
Memory::free(pBuff);
Memory::close();
看起来是不是很酷:)
所有的秘密就藏在基类的DLL模板里,未完待续....