我有一个主应用程序,它从dylib
内部动态加载dylib
我希望从我的主程序中调用导出的函数。我正在使用dlopen(NULL,flag)
到retrieve my main applications handle
和dlsym(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");
答案 0 :(得分:5)
我认为更好的方法可能是使用动态库建立专有的协议,在其中通过传递函数指针的结构来初始化它。动态库需要简单地提供某种init(const struct *myfuncs)
或类似的函数,这使得实现动态库变得更加简单。
这也可以使实现更加便携。