dlsym
vrátí ukazatel na symbol. (Jako void*
být obecný.) Ve vašem případě byste jej měli přetypovat na ukazatel funkce.
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)
Takže toto je jeden z těchto vzácných případů, kdy je chyba kompilátoru dobrým vodítkem.;)
C umožňuje implicitní přetypování z void *
na jakýkoli typ ukazatele (včetně ukazatelů funkcí); C++ vyžaduje explicitní přetypování. Jak říká leiflundgren, musíte přetypovat návratovou hodnotu dlsym()
na typ ukazatele funkce, který potřebujete.
Mnoho lidí považuje syntaxi ukazatele funkcí v jazyce C za trapnou. Jedním z běžných vzorů je typdef ukazatele funkce:
typedef double (*cosine_func_ptr)(double);
Můžete definovat proměnnou ukazatele funkce cosine
jako člen vašeho typu:
cosine_func_ptr cosine;
A přetypovat pomocí typu místo nešikovné syntaxe ukazatele funkce:
cosine = (cosine_func_ptr)dlsym(handle, "cos");