symbolik und shared libraries
-
Ich möchte eine dynmaische Anwendnung erstellen, die mit Hilfe von Modulen (*.so-Dateien) realisiert werden soll. Ich kann die shared Libs bereits erstellen und mittels extern "C"-Methoden auf die in den Libs enthaltenen Klassen zugreifen.
Mein Problem und die Frage die daraus entsteht ist Folgende: Ich nutzte innerhalb der Lib einen Logger aus dem Code der später auch die Lib nutzen soll. Der Logger eine statische Methode bereitstellt. Wenn ich die Lib mittels
g++ -shared -rdynamic Logger.cpp pluginInterface.cpp DummyAnalyser.cpp Analyser.cpp -o plugin1.so
erstelle funktioniert der Zugriff über dlopen(...) und dlsym(...) einwandfrei. Problem ist aber, dass die Methode des Loggers (log(...)) in die Libs gelinkt wird (kann man mit nm plugin1.so sehen).
Wenn ich einen Lib erstellt habe und dann die Implementierung von log(...) ändere, wird deshalb die Implementierung genutzt, die in die Lib gelinkt wurde. (Eigentlich auch logisch!!!)
Kann ich die Lib erstellen ohne sie mit der Logger.cpp zu linken?
Sollten die oben stehenden Informationen nicht ausreichen um das Problem zu lösen, kann ich gerne sources und kompileraufrufe posten... Ich vermute jedoch, dass der Fehler beim kompilieren der lib liegt!
Danke im voraus!
Mogul
-
Verstehe ich das jetzt richtig, Du möchtest die Implementierungen aus Logger.cpp nicht mit in Deiner .so haben, sondern lediglich die Implementierungen aus dem Hauptprogramm benutzen, welches die .so lädt?
Wenn dem so ist: Compilier halt die Logger.cpp nicht mit in Deine .so, sondern nur ins Haupsprogramm!?
Wenn nicht: Bitte reformulieren
-
Genau das ist mein Problem! Ich habe es bereits probiert, die lib ohne die Logger.cpp zu erstellen, wobei der kompilieren funktioniert, aber beim Laden der lib der Fehler "undefined symbol: _ZN6engine7network6Logger3logERKNS1_11messageTypeEPKcS6_" erscheint.
Im übrigen öffne ich die Lib mit
handle = dlopen(path.c_str(), RTLD_LAZY | RTLD_GLOBAL);
Vielleicht ist der Aufruf dort schon falsch!
-
Ich glaube das geht nicht. Ich habe das zB so gelöst, dass ich (hier: Logger.cpp) als statc lib kompiliert habe .... ich beschäftige mich erst seit 2 tagen damit, also keine gewähr ob das was bringt oder so richtig ist ^^
-
Alle Symbole, also Funktionen, Klassen, Methoden und Variable, die von mehreren Modulen (programm oder shared-lib) gehören in einen shared-lib. Erstelle eine shared-lib mit dem Logger und linke sowohl dein Programm als auch deine shared-lib mit dieser lib. Änderst Du die Implmenetierung des Loggers, erstelltst Du die shared lib neu. Wenn sich das Interface nicht ändert, brauchst Du nicht mal neu zu linken.
Tntnet
-
erscheint mir schlüssig! Ich denke so wird es funktionieren... Vielen Dank für die schnelle und erfolgreiche Hilfestellung!