错误:在 DLSYSM 的情况下,从“void*”到“void (*)()”的转换无效

error: invalid conversion from `void*` to `void (*)()` in case of dlsysm

本文关键字:void 转换 无效 DLSYSM 错误 情况下      更新时间:2023-10-16

我正在创建剪切对象并使用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;
}

由于dlsym可以返回指向任何签名函数的指针,因此其设计者选择返回不透明的void*。当然,dlsym工作假设这样的void*可以安全地转换为正确的函数指针类型。这是按如下方式完成的:

auto fnptr = reinterpret_cast<void(*)()>(dlsym(handle , "fun"));

void *与函数指针不兼容。

在这种情况下,需要强制转换:

fnptr = (void (*)())dlsym(handle , "fun");

我从未使用过dlsym,但在这里他的手册页是这样说的:

函数 dlsym(( 采用 dlopen(( 返回的动态库的"句柄"和以 null 结尾的符号名称,返回该符号加载到内存中的地址

所以它返回的不是函数指针,而是标准指针!以下方法应该有效:

void* returnedAddress = dlsym(handle , "fun");
fnptr = reinterpret_cast<void(*)()>(returnedAddress);