我正在使用dlsysm()创建剪切对象并打开但是我收到以下错误:
错误:无效转换为“void *”到“void(*)()”
这是我的代码:
#include<iostream>
#include<dlfcn.h>
using namespace std;
int main() {
void (*fnptr)();
void *handle;
handle = dlopen("./libtestshared.so",RTLD_LAZY);
if (!handle) {
cerr << "Cannot open library: " << dlerror() << '\n';
} else {
cout<<"Opening"<<'\n';
}
fnptr = dlsym(handle , "fun");
return 0;
}
答案 0 :(得分:4)
由于dlsym
可以返回指向任何签名函数的指针,因此其设计者选择返回不透明void*
。当然,dlsym
可以假设这样的void*
可以安全地转换为正确的函数指针类型。这样做如下:
auto fnptr = reinterpret_cast<void(*)()>(dlsym(handle , "fun"));
答案 1 :(得分:2)
void *
与函数指针不兼容。
在这种情况下需要演员:
fnptr = (void (*)())dlsym(handle , "fun");
答案 2 :(得分:0)
我从来没有使用过dlsym,但是他manpage说的是:
函数dlsym()接受dlopen()返回的动态库的“句柄”和以null结尾的符号名称,返回该符号加载到内存中的地址。
所以它返回的不是函数指针而是标准指针!以下内容应该有效:
var vid = $("#video");
function pauseVid() {
vid.pause();
}
$(".resetButton").click(function(){
pauseVid();
}