我今天遇到了类似于这段代码的东西。
在A.h
中:
class A { blah blah blah }
#define CREATE_A_FUNC_NAME ("CreateA")
extern "C" A* CreateA(void);
typedef A* (*funcCreateA)(void);
在main.cpp
中:
void* handle = dlopen("libA.so", RTLD_LAZY);
funcCreateA func = (funcCreateA)dlsym(handle, CREATE_A_FUNC_NAME);
A* a = func();
现在显然A.h只是声明的标头,并且其所有实现都存储在libA.so
中。
我已经测试过,如果我正确设置了我的项目,这意味着lib已正确链接,我可以简单地执行A* a = CreateA()
以获取指向新创建的A实例的指针。因此,这里出现了问题。为什么要通过一个简单的函数调用来完成一些简单的事情呢?这种技术称为什么?优缺点都有什么?我什么时候应该使用这种技术?谢谢!
使用dlsym而不是直接链接到DSO的主要原因:
值得注意的是,如果直接链接到DSO,在后台,链接器将仅在应用程序启动时插入dlsym / dlopen代码,这将自动加载DSO并解析符号。