Compilazione di librerie condivise dinamiche con g++

Compilazione di librerie condivise dinamiche con g++

C consente cast impliciti da void * a qualsiasi tipo di puntatore (inclusi i puntatori a funzione); C++ richiede il cast esplicito. Come dice leiflundgren, devi eseguire il cast del valore restituito di dlsym() al tipo di puntatore funzione che ti serve.

Molte persone trovano scomoda la sintassi del puntatore alla funzione di C. Un modello comune è definire il typedef del puntatore alla funzione:

typedef double (*cosine_func_ptr)(double);

È possibile definire la variabile del puntatore alla funzione cosine come membro del tuo tipo:

cosine_func_ptr cosine;

E lancia usando il tipo invece della scomoda sintassi del puntatore alla funzione:

cosine = (cosine_func_ptr)dlsym(handle, "cos");

dlsym restituisce un puntatore al simbolo. (Come void* essere generico.)Nel tuo caso dovresti eseguirne il cast su 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.;)