QT-Dialoge in DLL's verpacken

Alles rund um die Programmierung mit Qt
Antworten
Shadow
Beiträge: 92
Registriert: 27. August 2005 18:15
Wohnort: Iserlohn
Kontaktdaten:

QT-Dialoge in DLL's verpacken

Beitrag von Shadow »

Sehr geehrtes Forum,

ich teste gerade eine von mir konzipierte, modulare Softwarearchitektur auf technische Machbarkeit. Sie soll plattformunabhängig sein und ich habe mich daher für die Implementierung mit C++ im Zusammenhang mit QT entschieden.
Meine derzeitige Entwicklungsumgebung:
MS Visual Studio 6.0 // C++ // QT 3.3.4 // (kein MFC!)

Die Modularität will ich dadurch erreichen, dass ich beim Start der Hauptapplikation DLL's lade (bzw. SO's unter Linux) und diese später aus der Hauptapplikation aufgerufen werden können.
Ein rudimentäres PlugIn-Framework habe ich dazu bereits geschrieben. Was mir nun Bauchschmerzen bereitet ist folgendes:
Bisher habe ich es in unzähligen Versuchen NICHT hinbekommen, einen QT-Dialog in eine DLL zu "verpacken", geschweige denn, diesen irgendwie aus der DLL zu exportieren. Sobald ich in einem DLL-Projekt qt-spezifischen Code einfüge und die Linkereinstellungen entsprechend ändere, kann ich zwar korrekt durchkompilieren, jedoch bekomme ich immer 8 Linkerfehler. Mein Ziel ist es, nach dem erfolgreichen Laden eines PlugIns einen, in der DLL befindlichen QT-Dialog, aus der Hauptapplikation aufrufen zu können. Was ist zu tun, damit ich mein Vorhaben realisieren kann? Liegt es an den Linkereinstellungen, oder gehe ich komplett falsch vor? In der QT-Dokumentation habe ich auch nichts konkretes für mein Problem finden können.

Hier der Auszug meiner Linkerfehler:

Code: Alles auswählen

LINK : warning LNK4044: Nicht erkannte Option "mt334.lib"; ignoriert
   Bibliothek Debug/dll2.lib und Objekt Debug/dll2.exp wird erstellt
dll2.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: virtual bool __thiscall qt_dll1Dialog::qt_property(int,int,class QVariant *)" (?qt_property@qt_dll1Dialog@@UAE_NHHPAVQVariant@@@Z)
dll2.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: virtual bool __thiscall qt_dll1Dialog::qt_emit(int,struct QUObject *)" (?qt_emit@qt_dll1Dialog@@UAE_NHPAUQUObject@@@Z)
dll2.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: virtual bool __thiscall qt_dll1Dialog::qt_invoke(int,struct QUObject *)" (?qt_invoke@qt_dll1Dialog@@UAE_NHPAUQUObject@@@Z)
dll2.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: virtual void * __thiscall qt_dll1Dialog::qt_cast(char const *)" (?qt_cast@qt_dll1Dialog@@UAEPAXPBD@Z)
dll2.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: virtual char const * __thiscall qt_dll1Dialog::className(void)const " (?className@qt_dll1Dialog@@UBEPBDXZ)
dll2.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: static class QMetaObject * __cdecl qt_dll1Dialog::staticMetaObject(void)" (?staticMetaObject@qt_dll1Dialog@@SAPAVQMetaObject@@XZ)
dll2.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: static class QString __cdecl qt_dll1Dialog::tr(char const *,char const *)" (?tr@qt_dll1Dialog@@SA?AVQString@@PBD0@Z)
Debug/dll2.dll : fatal error LNK1120: 7 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.
Browse-Informationsdatei wird erstellt...
dll2.dll - 8 Fehler, 2 Warnung(en)
:!: Für einen heißen Tip wäre ich sehr dankbar!
Olly
Beiträge: 8
Registriert: 25. August 2005 17:03
Wohnort: Castrop-Rauxel
Kontaktdaten:

Beitrag von Olly »

Moin!

Irgendwie sieht das so aus, als wenn die durch MOC erzeugten Metainformationen für die Dialoge fehlen. Das würde ich mal überprüfen.
Shadow
Beiträge: 92
Registriert: 27. August 2005 18:15
Wohnort: Iserlohn
Kontaktdaten:

Beitrag von Shadow »

Olly hat geschrieben:Moin!

Irgendwie sieht das so aus, als wenn die durch MOC erzeugten Metainformationen für die Dialoge fehlen. Das würde ich mal überprüfen.
:oops: ui...stimmt, in der MOC-Datei steht überhaupt nichts drin. Wie bekomme ich das denn jetzt hin, nachträglich noch die MOC-Informationen hinzuzufügen?
Ich bin in der Entwicklung mit QT noch ziemlich neu.
Ich wäre auch gerne bereit, Dir das Projekt zwecks Anschauung mal zuzusenden.

Gruß
Olly
Beiträge: 8
Registriert: 25. August 2005 17:03
Wohnort: Castrop-Rauxel
Kontaktdaten:

Beitrag von Olly »

tach nochmal!

Nur keine Panik... ist ganz einfach. :wink:

Da du ja VC++6 benutzt, kannst du einfach unter den Einstellungen (s. Benutzerdefiniertes Erstellen) deiner Header-Datei den MOC-Schritt einfügen.

Beispiel:
$(QTDIR)\bin\moc -o moc_$(InputName).cpp $(InputPath)

Wenn du die Dialogdaten direkt aus den UI-Dateien erzeugst, dann packst du eine ähnliche Zeile eben zu den Erstell-Anweisungen deiner UI-Datei.

Die erzeugte Datei packst du dann einfach mit in dein Projekt rein und gut ist.

Übrigens... wenn die Datei leer ist, kann´s natürlich auch sein, daß du das Q_OBJECT Macro nicht in der Header-Datei angegeben hast. Das kommt normalerweise direkt am Anfang. Zum Beispiel:

Code: Alles auswählen

class Testklasse : public QObject
{
  Q_OBJECT

  public:
    Testklasse(QObject *parent = 0);
    ~Testklasse();

  public slots:
    void receiveSignal(void);

  signals:
    void someDummySignal(void);

};

Bis denne...
Olly.
Shadow
Beiträge: 92
Registriert: 27. August 2005 18:15
Wohnort: Iserlohn
Kontaktdaten:

Beitrag von Shadow »

Olly hat geschrieben:tach nochmal!

Nur keine Panik... ist ganz einfach. :wink:

Da du ja VC++6 benutzt, kannst du einfach unter den Einstellungen (s. Benutzerdefiniertes Erstellen) deiner Header-Datei den MOC-Schritt einfügen.

Beispiel:
$(QTDIR)\bin\moc -o moc_$(InputName).cpp $(InputPath)

Wenn du die Dialogdaten direkt aus den UI-Dateien erzeugst, dann packst du eine ähnliche Zeile eben zu den Erstell-Anweisungen deiner UI-Datei.

Die erzeugte Datei packst du dann einfach mit in dein Projekt rein und gut ist.
[..cut..]
Erstmal Vielen Dank! Hat ein wenig gedauert, aber jetzt funktioniert es! Vorgehensweise für Leute, die vor dem Problem stehen:

1. QT-Projekt mit dem AddIn-Wizard erstellt und Dialog erstellen
2. Neues DLL-Projekt erzeugen
3. .CPP/.H./UI./MOC-Dateien aus dem Qt-Projekt zum DLL-Projekt kopieren bzw. hinzufügen
4. Benutzerdefinierte Einstellungen (s.o) in Projekteinstellungen hinzufügen
5. Fertig! :)

Gruss,
Michael
Antworten