在 iOS 中不能通过名称调用函数吗?我有一个名为的 C 函数getstring
。我这样称呼它:
void* handle = dlopen(NULL, RTLD_NOW);
if (handle)
{
fp func = dlsym(handle, "getstring");
if (!func)
responseField.text = [NSString stringWithUTF8String:dlerror()];
else {
char* tmpStr = func();
responseField.text = [NSString stringWithUTF8String:tmpStr];
}
}
else {
responseField.text = [NSString stringWithUTF8String:dlerror()];
}
当这个执行时,responseFiled.text
被设定为dlsym(...): symbol not found
。这意味着dlopen
有效但无效dlsym
。我使用转储二进制文件中的符号nm
看到了_getstring
存在。我检查了manual http://developer.apple.com/library/ios/#documentation/System/Conceptual/ManPages_iPhoneOS/man3/dlopen.3.html for dlsym
它说我不应该在名称中添加下划线。无论如何添加它并不能解决问题。我究竟做错了什么?
我曾问过类似的问题here https://stackoverflow.com/questions/4954361/calling-a-function-by-name-input-by-user关于在 Objective-C 中按名称调用函数,然后按照答案在 Mac 上成功尝试,所以这个问题似乎是 iOS 特有的。
我认为问题在于 iOS 上不支持 dlopen,即使您静态链接库也是如此。你should能够使用
dlsym(RTLD_SELF, "getstring");
因为 RTLD_SELF 意味着“开始查看调用 dlsym 的图像”。根据您使用 dlopen() 的方式,它应该完成相同的任务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)