错误:在 DLSYSM 的情况下,从“void*”到“void (*)()”的转换无效
error: invalid conversion from `void*` to `void (*)()` in case of dlsysm
我正在创建剪切对象并使用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);
相关文章:
- Boost buffer_cast 无法从 void* 转换为 PointerToPodType
- 将void*转换为某种类型的shared_ptr
- 如何将 void* 转换为函数指针?
- 对 C++ 中的特定标头使用 extern C 关键字是否允许从 void* 转换为 char*?
- 如何将 void 转换为 typedef void(..)(浮动)
- 无法将参数 1 从"int (__thiscall A::* *)(void)"转换为"int (__cdecl *)(void)"
- 从 'void *' 转换为 'const std::string *&' 必须具有所有中间指针 const 合格
- x = malloc(n * sizeof (int));无法将 void 转换为 int
- 错误:请求从“ void”转换为“ QString”的非量表类型
- 使用 LLVM 从 const void * 转换为模板类型时出现问题
- 如何修复错误:请求从"void"转换为非标量类型"std::vector<int>"
- void* 转换为基类并调用虚函数
- 将 void* 转换为 std::function<void()>
- 无法将参数 4 从 'void' 转换为'const char *'
- C++11 无法将 std::condition_variable::wait 从 'void' 转换为 'bool'
- 如何在 C++11 中将"const void*"转换为函数指针?
- 似乎无法在 c++ 中将 void* 转换为结构
- 将 void 转换为字节
- void * 转换为 int 语法的问题
- C++从类型“void*”转换为类型“double”无效