dlsym
renvoie un pointeur sur le symbole. (Comme void*
être générique.) Dans votre cas, vous devez le convertir en un pointeur de fonction.
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)
Donc, celui-ci de ces rares cas où l'erreur du compilateur est un bon indice.;)
C autorise les transtypages implicites à partir de void *
à tout type de pointeur (y compris les pointeurs de fonction) ; C++ nécessite un casting explicite. Comme le dit leiflundgren, vous devez convertir la valeur de retour de dlsym()
au type de pointeur de fonction dont vous avez besoin.
Beaucoup de gens trouvent la syntaxe du pointeur de fonction C maladroite. Un modèle courant consiste à typedef le pointeur de fonction :
typedef double (*cosine_func_ptr)(double);
Vous pouvez définir votre variable de pointeur de fonction cosine
en tant que membre de votre type :
cosine_func_ptr cosine;
Et castez en utilisant le type au lieu de la syntaxe maladroite du pointeur de fonction :
cosine = (cosine_func_ptr)dlsym(handle, "cos");