C++ 如何在我的c+中使用dlsym获得的我的c风格函数+;程序
所以基本上我不知道你在使用这个函数“createLib”我似乎无法使用它:C++ 如何在我的c+中使用dlsym获得的我的c风格函数+;程序,c++,c,dlopen,dlsym,C++,C,Dlopen,Dlsym,所以基本上我不知道你在使用这个函数“createLib”我似乎无法使用它: auto createLibFunc = dlsym(lib, symbol.c_str()); 这是可行的,我用dlopen打开了动态加载的lib,我可以用dlsym获得函数符号,但我不知道如何使用uanch ceateLibFunc();在我获取它之后,它应该是类似createLibFunc()的东西;那么容易不?以下是createLibs函数: extern "C" IDisplayModule *createL
auto createLibFunc = dlsym(lib, symbol.c_str());
这是可行的,我用dlopen打开了动态加载的lib,我可以用dlsym获得函数符号,但我不知道如何使用uanch ceateLibFunc();在我获取它之后,它应该是类似createLibFunc()的东西;那么容易不?以下是createLibs函数:
extern "C" IDisplayModule *createLib()
{
return new LibNcurses();
}
IMHO最具可读性的解决方案是创建类型别名:
extern "C" typedef IDisplayModule* CreateLibT();
然后可以使用它声明函数指针的类型:
auto createLibFunc = reinterpret_cast<CreateLibT*>(dlsym(lib, symbol.c_str()));
auto-createLibFunc=reinterpret_cast(dlsym(lib,symbol.c_str());
您认为auto
将从dlsym()
中推断出返回值的类型是什么?我认为这是你不能明智地使用auto
的地方。我想,你需要一个重新解释\u cast
,除非它是静态\u cast
。而createLibFunc
的类型需要是IDisplayModule*(*createLibFunc)(
)。我不认为extern“C”
链接会影响指针类型,但我愿意学习其他方法。@JonathanLeffler:“两个具有不同语言链接的函数类型是不同的类型,即使它们在其他方面相同。”§9.11/p1。另请参见p4中的extern“C”typedef
示例。(<代码> TyPulf< /Calp>在这种情况下非常有用)。@ JONADENEL LIFFER如果类型包含函数类型,那么函数的签名将被C++所损坏。