实现C++ style的动态库函数加载器

动态库的动态加载在底层c运行库提供了三个函数 dlopen、dlsym、dlclose,非常简洁高效,但如果使用c++的方式,应该可以做到更好的易用性,或者更好的类型安全。

因此我们尝试了通过将动态库的导出方法通过定义类来固化,并且能使用c++模板来自动实现这些方法。

比如动态库memory.dll,包含了三个内存管理方法malloc,free,calloc,我们将这个库封装成了如下的Memory类:

struct Memory : DLL
{
    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模板里,未完待续....






你可能感兴趣的:(编程语言)