dlopen问题(OSX)

时间:2011-11-15 12:16:51

标签: c macos dlopen dlsym

我有一个主应用程序,它从dylib内部动态加载dylib我希望从我的主程序中调用导出的函数。我正在使用dlopen(NULL,flag)retrieve my main applications 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");

1 个答案:

答案 0 :(得分:5)

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

这也可以使实现更加便携。