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
moc-Objektdatei und eigene Objektdatei zusammenführen
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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... .
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... .
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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...
Abgesehen davon kann ein Projekt auch mehrere Libraries erzeugen...
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung