Wenn ich eine gemeinsame Bibliothek (gemeinsames Objekt) erstellen kann ich auf zwei Arten verwenden:
Erste Möglichkeit ist die Verwendung einer gemeinsam genutzten Bibliothek wie ich eine statische Bibliothek verwenden würde.Dilemma über gemeinsam genutzte Bibliotheken unter Unix
#include "myLib.h"
//...
//afterwards I can use functions defined in mylib.h
myFunction();
Die zweite Möglichkeit der gemeinsamen Bibliothek ist von Dynamic Loader API-Funktionen aufrufen: dlopen
, dlsym
und dlclose
von dlfcn.h
. Ich würde die shared library auf diese Weise verwenden, wenn ich zum Beispiel ein Plugin-Muster implementieren möchte. Eintrag würde wie folgt aussehen:
#include <dlfcn.h>
void *myLib; /* Handle to shared lib file */
void (*myFunction)(); /* Pointer to loaded function */
//...
//load shared object
myLib = dlopen("/home/dlTest/myLib.so",RTLD_LAZY);
dlerror();
//get handle to function
myFunction = dlsym(myLib, "myFunction");
dlerror();
//execute function
(*myFunction)();
//close lib
dlclose(myLib);
dlerror();
Nun meine erste Frage ist: Was ist der Unterschied zwischen diesen beiden Verwendungen des gemeinsam genutzten Objekts in Bezug auf die Ladezeit? Wenn wir die shared library auf die erste Art verwenden, verlinken/laden wir die shared library in der Ladezeit mit der main app und auf die zweite Weise machen wir dasselbe in der Laufzeit.
Zweite Frage. Wie heißen diese beiden Nutzungen? Die erste wird als statisch verknüpfte shared library und die zweite als dynamisch verknüpfte/geladene shared library bezeichnet.
Dritte Frage Wenn ich eine shared library ohne -fPIC
flag (oition unabhängigen Code) gebaut habe, wäre ich in der Lage, es auf eine zweite Weise zu verwenden?
Prost
Wenn ich eine gemeinsam genutzte Bibliothek ändere und neu kompiliere, muss ich alle Hauptanwendungen neu verknüpfen, die diese freigegebene Bibliothek verwenden, wenn ich implizite Verknüpfungen verwende, oder wenn diese Anwendungen automatisch geladen werden? –