日期:2014-05-16  浏览次数:20651 次

dlsym的疑惑,求解惑
我学习调用动态链接库,查了很多资料。
发现网上有两个版本的用法

版本1 :
void (*MeetingMixVoice)(short *, short *, UINT, UINT );//定义函数指针

dlopen()...
//然后直接这样用就可以
 MeetingMixVoice = dlsym(pdlHandle, "Mixpcm"); // 定位动态链接库中的函数 

版本2
void (*MeetingMixVoice)(short *, short *, UINT, UINT );//定义函数指针

dlopen()...
//然后要这样用才行!!!!!
 *(void **)(&MeetingMixVoice) = dlsym(pdlHandle, "Mixpcm"); // 定位动态链接库中的函数 

个人倾向于第一种版本,而且我发现CSDN得牌的人有的就是版本1的写法。
可是为什么我写成版本1时报错:
错误: 从类型‘void*’到类型‘void (*)(short int**, short int*, UINT, UINT) {aka void (*)(short int**, short int*, unsigned int, unsigned int)}’的转换无效 [-fpermissive]|
第二种 *(void **)(&MeetingMixVoice)时不报错,但这样写是什么意思???
真心疑惑了,求解惑啊!

------解决方案--------------------
void *dlsym(void *handle, const char *symbol);
函数返回值是 void*

*(void **)(&MeetingMixVoice):将函数指针 强制转化成 void*指针