GNU/Linux >> Linux Esercitazione >  >> Linux

Compilazione dinamica della libreria condivisa con g++

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");

Linux
  1. Linux:monitoraggio a livello di sistema delle chiamate a una funzione di libreria?

  2. Libreria condivisa dinamica C++ su Linux

  3. Convertire una libreria statica in una libreria condivisa?

  4. Collegamento statico della funzione di libreria condivisa in gcc

  5. Come inizializzare una libreria condivisa su Linux

Rileva librerie condivise obsolete in memoria con UChecker

Bash Scripting:funzioni spiegate con esempi

Introduzione alle librerie condivise Linux (come creare librerie condivise)

Come utilizzare la memoria condivisa con Linux in C

Come eseguire il controllo delle versioni di una libreria condivisa in Linux?

Impossibile caricare la libreria dinamica 'libnvinfer.so.6'