Dynamische Einbindung und Verwendung einer Shared Library



  • Hallo!

    Ich habe mal ein kleines C++-Programm geschrieben, das als Wrapper für einige MySQL-Funktionen gedient hat. Da das Programm im Grunde wie eine Bibliothek mit zusätzlichem Parser für Nutzereingabe funktioniert hat, möchte ich das ganze jetzt ganz gerne trennen. Die reinen Programmfunktionen ohne Nutzereingabe möchte ich in eine Shared Library (wie auch immer das Übersetzt heißt) packen, und die resultierende libanyname.so-Datei in einem Qt-Projekt verwenden, indem ich dann die Nutzereingabe realisiere. Die Verwendung soll dynamisch erfolgen, ich möchte also hinterher einfach nur die .so-Datei ersetzen müssen und nicht das ganze Qt-Programm neu kompillieren. Ich hoffe ich habe bei den Begrifflichkeiten jetzt nichts durcheinander gebracht, ich habe mich heute den ganzen Tag schon in das Thema eingelesen und das ist doch ziemlich viel was es da zu lernen gibt. Soweit sollte mein Vorhaben klar sein.

    Nun habe ich also schon den Code separiert. Das C++-Programm habe ich soweit abgespeckt, das ich nur noch die reinen Klassen und Funktionen für die Datenbank-Verwaltung habe. In Eclipse habe ich das jetzt in ein neues Shared-Library-Projekt gepackt, mir kompillieren lassen und erhalte jetzt eine Datei "libsnet.so". Das scheint also zumindest geklappt zu haben. Daraufhin habe ich das Qt-Programm in einem neuen Ordner erstellt, die .so-Datei dorthin kopiert und kompilliert: Läuft alles glatt, das "MainWindow" wird mir angezeigt. Qt erzeugt das makefile automatisch, deswegen muss ich auch Qt-sagen, welche Bibliotheken ich gerne eingebunden hätte. Das mache ich in der pro-Datei, die Qt eigentlich automatisch erzeugt, ich aber trotzdem erweitern kann:

    LIBS += -L./lib/snet

    Soweit gut, wenn ich jetzt kompilliere, gibt der Linker folgendes aus:

    g++ -Wl,-O1 -o snet-interface main.o mainwindow.o moc_mainwindow.o -L/usr/lib -L./lib/snet -lQtGui -lQtCore -lpthread

    Das Linken scheint also auch zu funktionieren. Nur jetzt kommt der Punkt, wo ich auf dem Schlauch stehe: Ich möchte gerne eine Klasse aus der Bibliothek in meinem Programm verwenden, und zwar in der "mainwindow.cpp" bzw. "mainwindow.h"... Was muss ich da jetzt #include-en?? Das ist eine recht einfache Frage, vermute ich, aber ich suche wirklich schon seit neun Uhr im Internet und konnte nichts finden. Mein C++-Buch beschäftigt sich überhaupt nicht mit Bibliotheken, deswegen ist das auch keine große Hilfe. Ich schreibe hier gerade nochmal die Dateien, die alle in meiner libsnet.so-Bibliothek sind:

    converters.cpp
    converters.h
    snetwork.cpp
    snetwork.h
    sitem.cpp
    sitem.h
    senum.h
    sconnection.h
    squery.h

    Ich würde in meinem Qt-Programm übrigens gerne die Klasse aus der Datei "snetwork.h" nutzen und habe es mit "#include <snetwork.h>" probiert, aber da bekomme ich beim kompillieren den Fehler, dass die Datei nicht existiere.

    Vielen Dank im Voraus und liebe Grüße,
    Jonathan



  • Ich habe soeben doch noch eine Seite gefunden (sogar auf Deutsch), die Bibliotheken perfekt und verständlich für Einsteiger (wie mich) erklärt:

    http://www.oreilly.de/german/freebooks/rlinux3ger/ch132.html

    Ich hoffe ich konnte auch anderen helfen 🙂


Anmelden zum Antworten