dlsym
devuelve un puntero al símbolo. (Como void*
para ser genérico.) En su caso, debe convertirlo en un puntero de función.
double (*mycosine)(double); // declare function pointer
mycosine = (double (*)(double)) dlsym(handle, "cos"); // cast to function pointer and assign
double one = mycosine(0.0); // cos(0)
Así que este es uno de estos raros casos en los que el error del compilador es una buena pista.;)
C permite conversiones implícitas desde void *
a cualquier tipo de puntero (incluidos los punteros de función); C++ requiere conversión explícita. Como dice leiflundgren, debe emitir el valor de retorno de dlsym()
al tipo de puntero de función que necesita.
Mucha gente encuentra incómoda la sintaxis del puntero de función de C. Un patrón común es tipear el puntero de función:
typedef double (*cosine_func_ptr)(double);
Puede definir su variable de puntero de función cosine
como miembro de tu tipo:
cosine_func_ptr cosine;
Y emita usando el tipo en lugar de la incómoda sintaxis del puntero de función:
cosine = (cosine_func_ptr)dlsym(handle, "cos");