Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 共享库为“时出错”;无效转换“;从void*到double(*)(int*)?_C++_C_Shared Libraries_Dynamic Linking - Fatal编程技术网

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指针

  • 指向void的指针可以转换为指向任何对象类型的指针,也可以转换为指向任何对象类型的指针。指向任何对象类型的指针可以转换为指向void的指针,然后再返回;结果应与原始指针进行比较

  • 如果是你的代码,你应该使用适当的文件扩展名来区分C和C++,或者强制编译器使用我不推荐的合适的编译器,只需修复文件扩展名。

    < p>你只是调用了错误的编译器。在中,如果不强制转换,则无法从
    void*
    转换为其他指针类型。如果这不是您的代码,那么,缺少强制转换意味着代码不是。请阅读标签wiki了解,C和C++不是同一语言,它们有点相似,但肯定不一样。 这来自标准草案n1570

    6.3.2.3指针

  • 指向void的指针可以转换为指向任何对象类型的指针,也可以转换为指向任何对象类型的指针。指向任何对象类型的指针可以转换为指向void的指针,然后再返回;结果应与原始指针进行比较

  • 如果是您的代码,您应该使用适当的文件扩展名来区分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您能支持该断言吗?这不会改变您刚才澄清的内容,是吗?这不会改变您刚才澄清的内容,是吗?