GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Dynamische Shared Library-Kompilierung mit g++

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

Linux
  1. Einführung in gemeinsam genutzte Linux-Bibliotheken (So erstellen Sie gemeinsam genutzte Bibliotheken)

  2. C++ Dynamic Shared Library unter Linux

  3. Statischer Link der gemeinsam genutzten Bibliotheksfunktion in gcc

  4. Wie kann eine gemeinsam genutzte Bibliothek (.so) eine Funktion aufrufen, die in ihrem Ladeprogramm implementiert ist?

  5. Rufen Sie Funktionsnamen in einer gemeinsam genutzten Bibliothek programmgesteuert ab

Erkennen Sie veraltete gemeinsam genutzte Bibliotheken im Speicher mit UChecker

Bash Scripting – Funktionen mit Beispielen erklärt

Woher wissen Sie, dass die angegebene gemeinsam genutzte Bibliothek mit Debug-Symbolen erstellt wurde oder nicht?

SDL2 unter Linux mit g++ verwenden?

Fehler beim Laden der gemeinsam genutzten Bibliothek (glew)

Dynamisches Linken - Linux vs. Fenster