Ich habe eine Anwendung, von der ein Teil gemeinsame Bibliotheken verwendet. Diese Bibliotheken sind zur Kompilierzeit verknüpft.
Zur Laufzeit erwartet der Loader das gemeinsame Objekt in der LD_LIBRARY_PATH
, wenn nicht gefunden, stürzt die gesamte Anwendung mit Fehler "nicht in der Lage, gemeinsame Bibliotheken zu laden." Beachten Sie, dass es keine Garantie gibt, dass Client die Bibliothek haben würde Falls die Anwendung eine entsprechende Fehlermeldung hinterlassen soll, sollte auch der unabhängige Teil korrekt funktionieren.Alternativen zu dlsym() und dlopen() in C++
Zu diesem Zweck verwende ich dlsym()
und dlopen()
, um die API in der gemeinsam genutzten Bibliothek zu verwenden. Das Problem damit ist, wenn ich viele Funktionen in der API habe, muss ich auf sie einzeln mit dlsym()
und ptrs zugreifen, die in meinem Fall zu Speicherbeschädigung und Codeabstürzen führen.
Gibt es dafür Alternativen?
und wie rufe ich dlopen() auf, um den foo_handle zu bekommen? Ich meine, wird es das API Shared Object sagen libAPI.so automatisch laden ?? – sud03r
Es ist dlopen() eigentlich zum Öffnen der Bibliothek ... :) .. nyways ich habe ur Punkt .. aber das funktioniert nur, wenn es eine APIs Struktur in der Bibliothek gibt .. die Sie nicht mit einer dritten Partei erwarten können Bibliothek .. Ich versuche, Sungrid api libdrmaa.so .. – sud03r
Statt einen Zeiger auf eine Tabelle zu bekommen, könnten Sie stattdessen einen Zeiger auf eine Funktion, die beim Aufruf den Zeiger auf die Tabelle zurückgibt. Dadurch kann sich das Plugin selbst initialisieren, bevor eine andere Funktion aufgerufen wird, und die Tabelle sogar dynamisch erstellen. – CesarB