dlsym
gibt einen Zeiger auf das Symbol zurück. (Als void*
um generisch zu sein.)In Ihrem Fall sollten Sie es in einen Funktionszeiger umwandeln.
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)
Dies ist also einer dieser seltenen Fälle, in denen der Compiler-Fehler ein guter Hinweis ist.;)
C erlaubt implizite Umwandlungen von void *
auf jeden Zeigertyp (einschließlich Funktionszeiger); C++ erfordert explizites Casting. Wie leiflundgren sagt, müssen Sie den Rückgabewert von dlsym()
umwandeln zum gewünschten Funktionszeigertyp.
Viele Leute finden die Funktionszeiger-Syntax von C umständlich. Ein gängiges Muster besteht darin, den Funktionszeiger zu typedef:
typedef double (*cosine_func_ptr)(double);
Sie können Ihre Funktionszeigervariable cosine
definieren als Mitglied Ihres Typs:
cosine_func_ptr cosine;
Und casten Sie mit dem Typ anstelle der umständlichen Funktionszeiger-Syntax:
cosine = (cosine_func_ptr)dlsym(handle, "cos");