C++ 对于具有常量类型的函数,如何正确地从dlsym强制转换返回值?

C++ 对于具有常量类型的函数,如何正确地从dlsym强制转换返回值?,c++,dlsym,C++,Dlsym,我想用dlsym检索一个函数指针,它的原型中有const char*s。如何才能正确完成此操作,我尝试了: int main (void) { void *alprhandle = NULL; std::string alprlib = "/usr/lib/libalpropencv.so.3"; #ifdef DLSYM void*(*palpr_init)(const char*, const char*, const char*, const char*);

我想用
dlsym
检索一个函数指针,它的原型中有
const char*
s。如何才能正确完成此操作,我尝试了:

int main (void)
{
    void *alprhandle = NULL;
    std::string alprlib = "/usr/lib/libalpropencv.so.3";
#ifdef DLSYM
    void*(*palpr_init)(const char*, const char*, const char*, const char*);
    int (*palpr_is_loaded)(void*);
    alpr::AlprResults (*palpr_recognize)(std::vector<char>);

    //open OpenALPR OpenCV library
    alprhandle = dlopen(alprlib.c_str(), RTLD_NOW);
    if (!alprhandle){
        std::cerr << dlerror() << alprlib <<std::endl;
        exit(0);
    }
    //find the address of functions
    palpr_init = (const char*, const char*, const char*, const char*)dlsym(alprhandle, "openalpr_init");
    if (!palpr_init)

使用函数指针时,最好为类型声明一个
typedef
,然后只需键入一次,这样更容易更改,并且可以在强制转换中使用

例如,使用typedefs,您的代码将变为:

typedef void*(*palpr_init_t)(const char*, const char*, const char*, const char*);
typedef int (*palpr_is_loaded_t)(void*);
alpr::AlprResults (*palpr_recognize_t)(std::vector<char>);

int main (void)
{
    void *alprhandle = NULL;
    std::string alprlib = "/usr/lib/libalpropencv.so.3";
#ifdef DLSYM
    palpr_init_t palpr_init;
    palpr_is_loaded_t palpr_is_loaded;
    palpr_recognize_t palpr_recognize;

    //open OpenALPR OpenCV library
    alprhandle = dlopen(alprlib.c_str(), RTLD_NOW);
    if (!alprhandle){
        std::cerr << dlerror() << alprlib <<std::endl;
        exit(0);
    }
    //find the address of functions
    palpr_init = (palpr_init_t)dlsym(alprhandle, "openalpr_init");
    if (!palpr_init)
typedef void*(*palpr_init_t)(常量字符*,常量字符*,常量字符*,常量字符*);
typedef int(*帕尔普已加载)(无效*);
alpr::AlprResults(*palpr______t)(标准::向量);
内部主(空)
{
void*alprhandle=NULL;
std::string alprlib=“/usr/lib/libalpropencv.so.3”;
#ifdef DLSYM
帕尔普雷尼特帕尔普雷尼特;
帕尔普若已加载,帕尔普若已加载;
帕尔普·鲁尔承认,帕尔普·鲁尔承认;
//打开OpenALPR OpenCV库
alprhandle=dlopen(alprlib.c_str(),RTLD_NOW);
如果(!alprhandle){

如果我的函数返回一个
int
而不是
void*
,该怎么办?按照您的typedef方法,我得到
无法将'int(**)(void*)转换为'int(*)(void*))'在赋值中
您做错了什么。显示产生错误的代码。请参阅上面的EDIT1,
palpr\u加载了相关函数。您显示的代码与您实际编译的代码不同。
typedef void* (*palpr_init_type)(const char*, const char*, const char*, const char*);
palpr_init_type palpr_init = (palpr_init_type)dlsym(...)
typedef void*(*palpr_init_t)(const char*, const char*, const char*, const char*);
typedef int (*palpr_is_loaded_t)(void*);
alpr::AlprResults (*palpr_recognize_t)(std::vector<char>);

int main (void)
{
    void *alprhandle = NULL;
    std::string alprlib = "/usr/lib/libalpropencv.so.3";
#ifdef DLSYM
    palpr_init_t palpr_init;
    palpr_is_loaded_t palpr_is_loaded;
    palpr_recognize_t palpr_recognize;

    //open OpenALPR OpenCV library
    alprhandle = dlopen(alprlib.c_str(), RTLD_NOW);
    if (!alprhandle){
        std::cerr << dlerror() << alprlib <<std::endl;
        exit(0);
    }
    //find the address of functions
    palpr_init = (palpr_init_t)dlsym(alprhandle, "openalpr_init");
    if (!palpr_init)