错误:在dlsysm的情况下,从`void *`无效转换为`void(*)()`

时间:2017-03-22 12:30:33

标签: c++ c++11 dlopen dlsym

我正在使用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;
}

3 个答案:

答案 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();
}