C++ 共享库为“时出错”;无效转换“;从void*到double(*)(int*)?
您好,我正在尝试实现共享库(动态链接)下面是代码,我得到的错误如下,请帮助我修复它C++ 共享库为“时出错”;无效转换“;从void*到double(*)(int*)?,c++,c,shared-libraries,dynamic-linking,C++,C,Shared Libraries,Dynamic Linking,您好,我正在尝试实现共享库(动态链接)下面是代码,我得到的错误如下,请帮助我修复它 错误:从“void*”到“double(*)(int*)”[-fppermissive]的转换无效 fn=dlsym(lib_handle,“ctest1”); ctest1.c void ctest1(int*i) { *i=5; } 上面的ctest1.c是在下面的hello.cc文件中使用的共享库 #包括 #包括 #包括 #包括“ctest1.h”//这里我已经声明了共享库的功能 int main(
错误:从“void*”到“double(*)(int*)”[-fppermissive]的转换无效
fn=dlsym(lib_handle,“ctest1”);
ctest1.c
void ctest1(int*i)
{
*i=5;
}
上面的ctest1.c是在下面的hello.cc文件中使用的共享库
#包括
#包括
#包括
#包括“ctest1.h”//这里我已经声明了共享库的功能
int main(int argc,字符**argv)
{
void*lib_句柄;
无效(*fn)(int*);
int x=990;
字符*错误;
lib_handle=dlopen(“libp.so”,RTLD_LAZY);//打开共享库
if(!lib_handle)
{
fprintf(stderr,“%s\n”,dlerror());
出口(1);
}
fn=dlsym(lib_handle,“ctest1”);//存储共享库函数的地址
如果((error=dlerror())!=NULL)
{
fprintf(stderr,“%s\n”,错误);
出口(1);
}
fn&x;
printf(“从共享库获取x值=%d\n”,x);
dlclose(lib_手柄);
返回0;
}
~~
~您只是调用了错误的编译器。在中,如果不强制转换,则无法从
void*
转换为其他指针类型。如果这不是您的代码,那么,缺少强制转换意味着代码不是。请阅读标签wiki了解,C和C++不是同一语言,它们有点相似,但肯定不一样。
这来自标准草案n1570
6.3.2.3指针
如果是你的代码,你应该使用适当的文件扩展名来区分C和C++,或者强制编译器使用我不推荐的合适的编译器,只需修复文件扩展名。
< p>你只是调用了错误的编译器。在中,如果不强制转换,则无法从void*
转换为其他指针类型。如果这不是您的代码,那么,缺少强制转换意味着代码不是。请阅读标签wiki了解,C和C++不是同一语言,它们有点相似,但肯定不一样。
这来自标准草案n1570
6.3.2.3指针
如果是您的代码,您应该使用适当的文件扩展名来区分C和C++,或者强制编译器使用我不推荐的适当编译器,只需修复文件扩展名。
<代码>代码> DLSIM返回<代码> VUL* >,并且您试图将其存储在函数指针中。当使用C++时,必须使用一个强制转换来实现它(假设从标签和文件结束.cc,虽然您的代码实际上是C)。您的类型还声明函数的返回类型为
double
,但您的库函数返回void
。这将必须得到修复,否则您将遇到运行时问题 dlsym
返回一个void*
,您试图将其存储在函数指针中。当使用C++时,必须使用一个强制转换来实现它(假设从标签和文件结束.cc,虽然您的代码实际上是C)。
您的类型还声明函数的返回类型为
double
,但您的库函数返回void
。这将必须得到修复,否则您将遇到运行时问题 首先我创建了一个对象文件gcc-c ctest1.c,然后在创建了一个对象文件之后,使用命令gcc-shared-o libp.so ctest1.o创建了一个共享库之后,我将主代码编译为gcc-g-rdynamic-o progdl dynamic.cc-ldl对象类型
和函数指针不兼容。@mhc您能支持该断言吗?您能详细说明并帮助我解决这个问题吗?首先我创建了一个对象文件作为gcc-c ctest1.c,然后创建了一个对象文件,然后使用命令gcc-shared-o libp.so ctest1.o after创建了一个共享库创建共享库之后,我将主代码编译为gcc-g-rdynamic-o progdl dynamic.cc-ldl指向任何对象类型的指针和函数指针不兼容。@mhc您能支持该断言吗?这不会改变您刚才澄清的内容,是吗?这不会改变您刚才澄清的内容,是吗?