5

我有一个主应用程序,它dylib从内部动态加载一个 ,dylib我想从我的主程序中调用导出的函数。我dlopen(NULL,flag)用来检索我的主要应用程序 handledlsym(handle, symbol)获取function.

dlopen给了,no error但是当我尝试dlsym我的时候,function我得到了以下信息error

dlerror dlsym(RTLD_NEXT, CallMe): symbol not found

该符号已导出,经nm确认已更正, 我不确定为什么RTLD_NEXT会出现这种情况?这是结果dlopen(NULL,flag)吗?

我怎样才能解决这个问题或实现我的目标?

还是有其他方法可以调用主应用程序(最好不是通过将函数指针传递给 dylib)?

提前致谢!

添加:

出口:

extern "C" {
    void CallMe(char* test);    
}
__attribute__((visibility("default")))
void CallMe(char* test)
{
    NSLog(@"CallMe with: %s",test);
}

nm的结果

...
0000000000001922 T _CallMe
..

dylib中的代码:

void * m_Handle;
typedef void CallMe(char* test);
CallMe* m_Function;

m_Handle = dlopen(NULL,RTLD_LAZY); //Also tried RTLD_NOW|RTLD_GLOBAL

if(!m_Handle)
    return EC_ERROR;

m_Function = (CallMe*)dlsym(m_Handle, "CallMe");
if(!m_Function)
    return EC_ERROR;

m_Function("Hallo");
4

1 回答 1

5

我认为更好的方法可能是与您的动态库建立一个专有协议,您可以通过向它传递一个函数指针结构来对其进行初始化。动态库需要简单地提供某种init(const struct *myfuncs)或类似的功能,这使得动态库的实现更简单。

这也将使实现更具可移植性。

于 2011-11-15T13:04:34.713 回答