Linker Fehler sobald ich signals an slots connecten will

Verschiedenes zu Qt
Antworten
Micka
Beiträge: 6
Registriert: 19. November 2009 13:21

Linker Fehler sobald ich signals an slots connecten will

Beitrag von Micka »

Hallo, ich arbeite an einem Projekt in dem ich ein kleines QWidget erstelle um Statistiken etc auszugeben.
Das Projekt ist eine DLL, die in einem framework läuft (welches selbst eine QT GUI nutzt) und ich habe immer Konsolenmeldungen bekommen, wenn ich QTable Entries erstellt habe und teilweise gibt es Abstürze, weil ich Schriftfarben von Labels verändere etc.

Nun habe ich herausgefunden, dass das ganze vermutlich daran liegt, dass bestimmte Dinge nur im GUI-Thread, bzw per signals/slots stattfinden dürfen.

ok, nach ein wenig Tüftelei habe ich meine slots geschrieben und per MOC die signals erstellen lassen, aber sobald ich versuche beides zu connecten, gibt es einen linker-fehler.


Da ich die Vermutung hatte, dass evtl doch irgendwas mit meinen signals/slots falsch ist, habe ich einfach mal folgendes probiert:

Code: Alles auswählen

QPushButton* testButton;
testButton = new QPushButton("TESTBUTTON",this);
testButton->show();
testButton->move(QPoint(0,0));
testButton->resize(QSize(100,100));
	QObject::connect(testButton,SIGNAL(clicked()),testButton,SLOT(hide()));

trotzdem bekomme ich folgenden Linker-Fehler (kompilieren tut's ansonsten wunderbar, wenn ich die connect Zeile auskommentiere gibt's auch keine Linker-Fehler mehr)

ProcessPanorama error LNK2019: Nicht aufgelöstes externes Symbol '"__declspec(dllimport) char const * __cdecl qFlagLocation(char const *)" (__imp_?qFlagLocation@@YAPBDPBD@Z)', verwiesen in Funktion '"public: __thiscall StatusWidget::StatusWidget(void)" (??0StatusWidget@@QAE@XZ)'



jemand ne Idee was ich falsch mache, bzw wie ich das hinbekomme? =)
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

Du benutzt Signals/Slots.
Dann brauchst Du das Qt-Macro Q_OBJECT.

Hast Du dies in der Klasse mit drin?
Linux, das längste Text-Adventure aller Zeiten
Micka
Beiträge: 6
Registriert: 19. November 2009 13:21

Beitrag von Micka »

ich dachte man braucht das Macro nur wenn man eigene signals/slots schreibt?
aber das connecten (bzw das linken später) funktioniert ja schon bei dem beispielcode nicht, obwohl da ja nur vorgefertigte Qt signals/slots benutzt werden.

aber ich habe Q_OBJECT so oder so im header drin.

trotzdem danke.

kann es etwas damit zu tun haben, dass ich in meinem projekt garnicht die normale
main -> qApp -> return app.exec
struktur habe? also ich programmiere an einer DLL, die dann in dieses framework geladen wird.

diese dll verarbeitet Bilder und ich erstelle mir für Statistikausgaben halt einfach ein kleines QWidget.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

deine application, also die exe, die deine Dll aufruft, was fuer eine version der qt nutzt die ?

Ansonsten brauchst du in der dll sobald du ne QObjecte Hirarchie anlegst, ein instanzieiertes QApplication object. Aber das fehlen sollte dir zumindest keine linkerfehler bringen sondern zur laufzeit aufschlagen ...

welche libs linkst du zur dll dazu ? und welche version ?
sind QT klassen Also QIrgendwas teil deiner Schnittstelle zwischen App und DLL ? Also sind in deiner Exportdefinition QT klassen, bzw interfaces die wiederum QT klassen verwenden, vorhanden ?

Ciao ...
Micka
Beiträge: 6
Registriert: 19. November 2009 13:21

Beitrag von Micka »

RHBaum hat geschrieben:deine application, also die exe, die deine Dll aufruft, was fuer eine version der qt nutzt die ?
weiss ich leider nicht, ich könnte die Applikation aber auch mal selbst neu kompilieren, mit derselben Qt version die ich bei mir benutze. Das würd ich aber nur dann machen wenn die Aussicht auf Erfolg hoch ist...
RHBaum hat geschrieben: welche libs linkst du zur dll dazu ? und welche version ?
QtCore4.lib
QtGui4.lib
qtmaind.lib
version 4.5.1 wenn ich der textdatei im qt verzeichnis glauben kann (qt wird hier irgendwie zentral updated)

sowie einige andere sachen (verschiedene openCV libs z.B.)
RHBaum hat geschrieben: sind QT klassen Also QIrgendwas teil deiner Schnittstelle zwischen App und DLL ? Also sind in deiner Exportdefinition QT klassen, bzw interfaces die wiederum QT klassen verwenden, vorhanden ?
Wie finde ich das raus? Ich benutze eine vorgefertigte Klasse von der ich meine Klasse ableite. Einige Funktionen haben DLL davor stehen, ich vermute das sind die Schnittstellen?



Was mir gerade noch aufgefallen ist, bei starten der Applikation (egal ob mit oder ohne DLL), bekomme ich die Konsolenmeldung: "Qt: Could not initialize OLE (error 80010106)"
Aber das sollte dem Linker ja erstmal egal sein...
Micka
Beiträge: 6
Registriert: 19. November 2009 13:21

Beitrag von Micka »

RHBaum hat geschrieben: Ansonsten brauchst du in der dll sobald du ne QObjecte Hirarchie anlegst, ein instanzieiertes QApplication object. Aber das fehlen sollte dir zumindest keine linkerfehler bringen sondern zur laufzeit aufschlagen ...
also ein QApplication object scheint es zu geben, qApp existiert und ich kann damit z.B. von meiner dll aus alle Qt Fenster der Applikation (und der dll) schließen...

ich habe auch schon qApp->connect(...) versucht, aber es kam nichts neues dabei raus =)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Da es ein Linkerfehler ist hat es nichts mit Q(Core)Application zu tun.
Bitte gib uns ein minimales Beispiel an dem wir sehen können was Du genau machst. Am obigen Codeausschnitt ist nichts falsches.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

LNK2019: Nicht aufgelöstes externes Symbol '"__declspec(dllimport) char const * __cdecl qFlagLocation(char const *)"
befinden sich mehrere Qt-Versionen auf dem Rechner.....?
Micka
Beiträge: 6
Registriert: 19. November 2009 13:21

Beitrag von Micka »

solarix hat geschrieben:befinden sich mehrere Qt-Versionen auf dem Rechner.....?
ja, ich glaube schon.
Leider kann ich das heute vermutlich nicht überprüfen.

Montag werd ich da mal genauer nach schauen und auch etwas mehr code hier posten.

Ansonsten werde ich dann auch versuchen, ein neues kleines Projekt zu erstellen (z.B. das aus dem Qt Tutorial) um zu schauen ob der Fehler immer auftritt, oder nur in meinem DLL-Projekt...


Schonmal danke
und schönes Wochenende allen :)
Micka
Beiträge: 6
Registriert: 19. November 2009 13:21

Beitrag von Micka »

solarix hat geschrieben: befinden sich mehrere Qt-Versionen auf dem Rechner.....?

so, fehler gefunden...
vielen dank :)

da wir hier zwischendurch Probleme mit der Administration hatten, hatte ich mir Qt auf einer anderen Festplatte nochmal eingebaut...
seltsam dass ich vorher noch keine Linkerprobleme bekommen habe =)

jetzt kann ich alles linken und es funktioniert auch alles so wie es soll :)

danke => gelöst und kann geschlossen werden
Antworten