【发布时间】:2020-04-30 18:46:39
【问题描述】:
我今天遇到了类似这段代码的东西。
在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 实例的指针。因此,问题来了。为什么要经历这么多麻烦来实现一个简单的函数调用?这种技术或技术叫什么?优缺点都有什么?我什么时候应该使用这种技术?谢谢!
【问题讨论】:
-
如果您将此 libA.so 链接到您的应用程序中,则不应使用
dlopen:ld.so将与您的可执行文件一起加载 libA.so。其他应用程序(Apache httpd 就是一个例子)有很多库,并不是在每个程序运行中都使用,或者一些库是由其他方创建的(例如 libphp.so),因此它们是动态加载的(通过 dlopen)取决于程序选项/配置文件/用户输入。
标签: c++ linux shared-libraries dynamic-linking