dlsym
restituisce un puntatore al simbolo. (Come void*
per essere generico.) Nel tuo caso dovresti trasmetterlo a un puntatore a funzione.
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)
Quindi questo è uno di questi rari casi in cui l'errore del compilatore è un buon indizio.;)
C consente cast impliciti da void *
a qualsiasi tipo di puntatore (compresi i puntatori a funzione); C++ richiede il casting esplicito. Come dice leiflundgren, devi lanciare il valore restituito di dlsym()
al tipo di puntatore funzione di cui hai bisogno.
Molte persone trovano scomoda la sintassi del puntatore di funzione di C. Un modello comune è typedef il puntatore a funzione:
typedef double (*cosine_func_ptr)(double);
Puoi definire la tua variabile puntatore di funzione cosine
come membro del tuo tipo:
cosine_func_ptr cosine;
E cast utilizzando il tipo invece della scomoda sintassi del puntatore a funzione:
cosine = (cosine_func_ptr)dlsym(handle, "cos");