Seite 1 von 1

moc-Objektdatei und eigene Objektdatei zusammenführen

Verfasst: 12. Juli 2011 22:20
von Spinoza
Hi,
Habe zwei Qt-Projekte, wobei Projekt A eine Klasse "AKlasse" in einem eigenen cpp/h-Dateipärchen definiert, welche von QObject abgeleitet ist. Ergo entstehen im Verzeichnis von Projekt A die Objektdateien "aklasse.o" und "moc_aklasse.o".

Wenn ich nun in Projekt B diese Klasse verwenden möchte, ohne das cpp/h-Pärchen zum Projekt hinzuzufügen (wird sonst extrem unübersichtlich), muss ich dem Linker per LIBS in der Projektdatei sagen, dass er mit "aklasse.o" und "moc_aklasse.o" verlinken soll, und natürlich den entsprechenden Header "aklasse.h" includen.

Wenn ich nur mit "aklasse.o" verlinke, bekomme ich einen Haufen reference-to-vtable-Fehler. Wie ich hier im Forum gelesen habe, liegt das wohl an virtuellen Funktionen des QObjects, die der moc schließlich implementiert und in die "moc_aklasse.o" steckt.

Nun zur Frage: Wie schaffe ich, dass ich nur gegen eine Objektdatei linken muss. Für jede Klasse extra nochmal diese moc-Objekdatei reinzulinken ist nervig und nach meinem Geschmack unsauber, da eine einzelne Klasse in zwei Objektdateien zerrissen wird. Kann man dem moc+gcc-Gespann irgendwie verklickern, dass sie bitteschön alles in die "aklasse.o" packen sollen?

MfG,
Spinoza

Verfasst: 12. Juli 2011 22:23
von Christian81
Ein Projekt als sich erstellt keine .o-Dateien welche in einem anderen Projekt benutzt werden. Entweder eine shared oder eine static lib - alles andere ist Blödsinn.

Verfasst: 12. Juli 2011 22:35
von Spinoza
Danke für die blitzschnelle Antwort.
Wenn ich dich richtig verstehe, sollte ich also ein drittes Projekt "C++-Bibliothek" erstellen, in welchem ich die geteilten Klassen verwalte und dann aus Projekt A und B auf die Ausgabe dieses dritten Projekts linken?

Dann fällt aber der comfort weg, dass man die Klasse sofort in einem Gui-Projekt testen kann, indem man einfach auf ausführen clickt bzw. STRG+R in die Tastatur hackt, oder?

Habe gerade überlegt ob man vielleicht QtCreator dazu anleiten könnte, nach Erstellen automatisch die *.o und moc_*.o per ld -Ur in eine einzelne Objektdatei zu linken; oder alternativ per ar rs in eine .a lib. Aber auch das erscheint mir von hinten durch die Brust ins Auge, wie man so schön sagt.
Wenn nichts hilft, werde ich wohl doch ein drittes library-Projekt anlegen müssen und zum Testen zwischen den Projekten hin und her hetzen... .

Verfasst: 12. Juli 2011 22:42
von Christian81
Ein Projekt hat als Endergebnis nie einfache Objekt-Dateien sondern entweder eine statisch oder dynamische Lirary oder ein Executable. Projekt A sollte also eine Library erzeugen gegen welche Projekt B dann linkt.
Abgesehen davon kann ein Projekt auch mehrere Libraries erzeugen...