如何为具有常量类型的函数正确转换来自 DLsym 的返回值?

how do i cast the return value from dlsym properly for function with const types?

本文关键字:转换 返回值 DLsym 函数 类型 常量      更新时间:2023-10-16

我想检索一个函数指针,其中包含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)

但是编译器告诉我error: expected primary-expression before ‘const’在呼叫dlsym()的线路旁

编辑1

typedef void*(*palpr_init_type)(const char*, const char*, const char*, const char*);
void*(*palpr_init)     (const char*, const char*, const char*, const char*);
typedef int (*palpr_is_loaded_type)(void*);
int (*palpr_is_loaded)     (void*);
typedef alpr::AlprResults (*palpr_recognize_type)(std::vector<char>);
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 = (palpr_init_type)dlsym(alprhandle, "openalpr_init");
if (!palpr_init)
std::cerr << "FATAL: Could not find openalpr_init " << dlerror() << std::endl;
palpr_is_loaded = (palpr_is_loaded_type)dlsym(alprhandle, "openalpr_is_loaded");
if (!palpr_is_loaded)
typedef void* (*palpr_init_type)(const char*, const char*, const char*, const char*);
palpr_init_type palpr_init = (palpr_init_type)dlsym(...)

使用函数指针时,最好的办法是为类型声明一个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)