与动态加载的库共享数据(dlopen,dlsym)

时间:2010-08-11 02:43:15

标签: c++

我的主程序将加载一个名为hello.so的简单动态库

主要


void* handle = dlopen("./hello.so", RTLD_LAZY);

在主 中,传递一个名为测试的回调函数(在main.h中的某个地方定义)并从动态调用hello()图书馆


typedef void (*callback)();
typedef void (*hello_t)( callback);

/* do something */

hello_t hello = (hello_t) dlsym(handle, "hello");
hello(testing);

在动态库中,


#include 
#include "main.h"

extern "C" void hello( void (*fn)() ) {
  /*do something and then invoke callback function from main */  fn();
}


除了使用回调之外,还有其他方法可以允许从动态库中调用/使用main的函数/数据吗?

1 个答案:

答案 0 :(得分:2)

不,在我看来,这是这样做的首选方式。我能想到的任何其他方式都涉及让DLL知道它所链接的程序中的对象,这很可能是不好的做法。

关于数据,只是提醒您虽然没有提出要求,但通常最佳做法是复制需要存储的任何数据,如果它通过库/程序边界传递的话。如果您使用的数据库的生命周期由程序控制,您可能会陷入完全混乱。反之亦然。