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

3
我的主程序将加载一个名为hello.so的简单动态库。
在main函数中,使用以下代码来调用hello.so动态库中的hello()函数,并传入一个回调函数testing(在main.h文件中定义):

void* handle = dlopen("./hello.so", RTLD_LAZY);
typedef void (*callback)(); typedef void (*hello_t)( callback);
hello_t hello = (hello_t) dlsym(handle, "hello"); hello(testing);
在动态库中的hello()函数通过以下方式调用回调函数fn:

#include 
#include "main.h"
extern "C" void hello( void (*fn)() ) { /*做一些事情,然后从主函数中调用回调函数*/ fn(); }
除了使用回调函数之外,还有其他方法可以允许从动态库中调用/使用主函数的函数/数据吗?
1个回答

2
不,这是我认为的首选方法。我能想到的其他方法都涉及使DLL了解与其链接的程序中的对象,这很可能是不好的实践。
关于数据,提醒一下尽管你没有询问,通常最好的做法是复制需要存储的任何数据,如果它通过库/程序边界传递。如果库使用由程序控制生命周期的数据,反之亦然,您可能会陷入完全混乱的状态。

这是因为我想在主程序和动态库中都使用相同的日志记录器(log4cxx)。 - user1492900
在这种情况下,回调函数绝对是一种可行的方法。 - Collin Dauphinee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接