Seite 1 von 1

Qt4 Qwt5-Designer Plugin

Verfasst: 6. März 2006 18:18
von [ToTTo]
Hi,

ich versuche gerade Qwt5 unter .Net 2005 zu kompilieren.
Die Qwt5.lib &-dll hat ohne Probleme funktioniert.
Nun verusche ich das QtDesigner -Plugin zu kompilieren bekomme aber leider immer Linkerfehler...

Code: Alles auswählen

qwt_designer_plugin.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: static struct QMetaObject const QwtPlot::staticMetaObject" (?staticMetaObject@QwtPlot@@2UQMetaObject@@B)".
qwt_designer_plugin.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: static struct QMetaObject const QwtDial::staticMetaObject" (?staticMetaObject@QwtDial@@2UQMetaObject@@B)".
Hat jemand eine Ahnung woran das liegen kann? gegen die qwt5.lib wird gelinkt und include pfade zu Qwt sind gesetzt.

Gruß

ToTTo

Verfasst: 24. April 2006 15:21
von Sebastian Müllender
Ich habe unter anderem dasselbe Problem.

Meine Umgebung:

Visual Studio .NET 2005
QT 4.1.1 (qt-win-commercial-4.1.1-vs2003 + qt-vsintegration-1.1.1 + qt-vsaddin-collection-2.1.1).
QWT 5.0 (SNAPSHOT 2006-01-30, laut sourceforge die einzige mit qtdesigner4 kompatible Version)

Ich kann zudem seit Tagen auch mit anderen QWT/QT/VC++ Versionen keine unproblematischen QWT Plugins für den QTDesigner kompilieren.
Die einzige Fassung bei der die .dll Datei des Plugins vom Designer überhaupt erkannt wurde war die von QWT 4.2.0 kompiliert mit VC++6.0 eingebunden in QT 3.0.5.

Ich hatte in dieser Kombination aber große Stabilitätsprobleme. Mein Programm stürzte mir zur Laufzeit oft ab, sobald QWT Widgets zum Einsatz kamen. Scheinbar ist die Ursache dafür dass bei der Übergabe von Zeigern über die .dll Grenzen hinweg die C Laufzeitbibliothek die enthaltenen Adressen als ungültig ansieht ( Das Programm sowie alle eingebundenen .exe und .dll Dateien wurden in der gleichen Umgebung als multithreaded kompiliert). Ich hatte gehofft mit QT4 und .NET 2005 eine stabile Version erzeugen zu können, bin aber nun mit meinem Latein am Ende.

Ich könnte qwt ja auch direkt in mein Programm linken. Allerdings müsste ich dennoch mit dem QWT Plugin im QT Designer arbeiten können und würde mit .NET 2005 kompatible Versionen entschieden vorziehen.

Verfasst: 24. April 2006 22:42
von Uwe
Die fehlenden Symbole sollten sich in src/moc/moc_qwt_plot.cpp bzw. src/moc/moc_qwt_dial.cpp im Qwt Directory befinden. Schau Dir doch bitte mal an wie die definiert und exportiert werden.

Was passiert, wenn Du "DEFINES += QWT_DLL" in qwtplugin.pro schreibst ?

Ich selber boote Windows eigentlich nur, wenn ich eine Version von Qwt veröffentlichen will. Da ich über keine kommerzielle Lizenz unter Windows verfüge, teste ich auch nur mit MinGW. Für Tests mit MSVC Compilern bin ich daher auf das Feedback von Euch Anwendern angewiesen.

Uwe

Verfasst: 25. April 2006 11:01
von [ToTTo]
Die Fehler entstehen durch Kompatibilitätsprobleme. Es müssen die DLLs im debug und im release Modus erstellt werden. Zudem müssen die Dateien qwt_plot.h, qwt_plot.cpp, qwt_dial.h und qwt_dial.cpp dem Projekt hinzugefügt werden.

Bei mir läuft so alles ohne Probleme.

Gruß

ToTTo

Verfasst: 26. April 2006 08:01
von Uwe
[ToTTo] hat geschrieben:Zudem müssen die Dateien qwt_plot.h, qwt_plot.cpp, qwt_dial.h und qwt_dial.cpp dem Projekt hinzugefügt werden.
Naja, den Code aus der Bibliothek in das Plugin zu duplizieren ist natürlich nicht wirklich die Lösung des Problems, auch wenn sie im Einzelfall hilft.

Könntest Du bitte mal wie ich vorgschlagen habe "DEFINES += QWT_DLL" in das .pro file des Plugins schreiben, bzw. mit "__declspec(dllimport)" in qwt_dial.h/qwt_plot.h herumspielen, um herauszufinden, warum das Plugin die Symbole nicht sieht ?

Uwe

Verfasst: 26. April 2006 10:32
von Sebastian Müllender
Schnelle Antwort und dann auch noch von einem der Entwickler. Wow.

Das definieren von QWT_DLL ist die Lösung. Danach können die entprechenden .dll Elemente fehlerfrei importiert werden.

Das Plugin wird anschließend auch erfolgreich erkannt. Man muss nur daran denken qwt5.dll ebenfalls in einem für den Designer zugänglichen Bereich zu halten.

Vielen Dank!

Verfasst: 26. April 2006 21:43
von wetim
die erstellung des plugins klappt bei mir mittlerweile auch.
nur bekomme ich es nicht in den designer

ich habe das qwt\lib verzeichnis als pfad gesetzt und die dll ins plugin verzeichnis vom designer kopiert.

im designer wird es aber nicht angezeigt

Verfasst: 26. April 2006 22:53
von Uwe
Wenn Pfad zu Plugin und Qwt DLL stimmen, sollte das in der Regel ein thread/nothread, debug/release o.ä Mismatch sein.

Uwe

Verfasst: 27. April 2006 23:22
von wetim
ok, nach neuem erstellen hat es funktioniert.

problem ist jetzt bloß, dass sobald ich QwtWheel verwenden will,
der designer abstürzt. die anderen elemente kann ich ohne probleme benutzen

woran könnte das liegen ?

(auch, wenn es beim kompilieren einiger bsp. probleme gab, hat es bei dem beispiel "radio", welches QwtWheel verwendet, funktioniert)

Verfasst: 28. April 2006 11:02
von Uwe
problem ist jetzt bloß, dass sobald ich QwtWheel verwenden will, der designer abstürzt. die anderen elemente kann ich ohne probleme benutzen
Starte den designer mal im Debugger und schau auf den Stack zum Absturzzeitpunkt.
(auch, wenn es beim kompilieren einiger bsp. probleme gab, ... )
Wenn Du die Probleme nicht benennst, können sie nicht behoben werden. Leider kannst Du derzeit nicht überprüfen, ob die nicht schon längst behoben sind, da Sourceforge seinen Super-GAU immer noch nicht vollständig verdaut hat, und derzeit leider nur 4 Wochen alte Stände des Qwt Quellcodes anbietet.

Uwe

Verfasst: 29. April 2006 21:27
von wetim
Starte den designer mal im Debugger und schau auf den Stack zum Absturzzeitpunkt.
dumme frage: wie mach ich sowas ? (hab mvs 6)

zu den fehlern z.b. bei cpu plot example:

qwt5.lib(qwt5.dll) : error LNK2005: "public: void __thiscall QVector<class QPointF>::detach(void)" (
?detach@?$QVector@VQPointF@@@@QAEXXZ) bereits in cpuplot.obj definiert
qwt5.lib(qwt5.dll) : error LNK2005: "public: __thiscall QVector<class QPointF>::~QVector<class QPoin
tF>(void)" (??1?$QVector@VQPointF@@@@QAE@XZ) bereits in cpuplot.obj definiert
qwt5.lib(qwt5.dll) : error LNK2005: "public: __thiscall QVector<class QPointF>::QVector<class QPoint
F>(class QVector<class QPointF> const &)" (??0?$QVector@VQPointF@@@@QAE@ABV0@@Z) bereits in cpuplot.
obj definiert

ähnliche fehler gibt es auch bei einigen anderen beispielen.

ich verwende die version vom 30.01.06
leider bin ich bezüglich qt / c nicht ganz so versiert ;-)

Verfasst: 30. April 2006 14:02
von Uwe
wetim hat geschrieben: qwt5.lib(qwt5.dll) : error LNK2005: "public: void __thiscall QVector<class QPointF>::detach(void)" (
?detach@?$QVector@VQPointF@@@@QAEXXZ) bereits in cpuplot.obj definiert
Hier handelt es sich um ein Template, daß sowohl von der Qt als auch der Qwt Schnittstelle exportiert wird. Ärgerlicherweise muß man das wohl mit unterschiedlichen MSVC Versionen unterschiedlich deklarieren.

Schau mal bitte in include/qwt_double_rect.h Zeile 31, ob Dein Compiler in den Q_CC_MSVC_NET-Zweig reinläuft. Falls ja, schau doch mal was passiert, wenn Du da dllexport statt dllimport hinschreibst.

Uwe

Verfasst: 30. April 2006 14:41
von wetim
ersetzen von import durch export bewirkt nichts.

gibt insgesamt 60 warnungen, die alle mit inkosistenter dll-bindung zu tun haben, wenn das bei der lösung hilft ?

Code: Alles auswählen

C:/Programme/Qt/4.1.2/include\QtCore/../../src/corelib/tools/qvector.h(285) : warning C4273: 'QVector<double>::QVector<double>' : Inkonsistente DLL-Bindung. dllexport angenommen.
(ist mir erst jetzt aufgefallen, nachdem ich alles neu erstellt habe)

Verfasst: 5. Mai 2006 13:32
von Sebastian Müllender
Da es sich für uns recht aufwändig gestaltet von QT3 zu QT4 zu migrieren prüfen wir gerade ob die Version 3.3.6 nicht für unsere Zwecke ausreichend ist und unser Programm stabil erzeugen kann. Dazu haben wir uns eine 30 Tage Evalution besagter QT Version geladen. Der Compiler ist nach wie vor VC++ .NET 2005.

Leider wird das QWT Plugin ( diesmal 4.2.0 ) erneut nicht vom Designer erkannt. Ich habe folgende Schritte analog zu dem qwt 5.0 plugin befolgt.

Kompilieren von qwt als release dll.
Kopieren sämtlicher Ausgabedateien nach %QTDIR%/bin

Kompilieren des qwt plugin als release dll.
( Beim Kopiervorgang:

libpng error: PNG file corrupted by ASCII conversion
uic: cannot load image file pixmaps\qwtcompass.png

das Bild wird auch von der Windows Bildanzeige nicht erkannt, ich hab einfach mal eine der anderen pixmaps kopiert und umbenannt. Anschließend fehlerfreies kompilieren.
)
Kopieren sämtlicher Ausgabedateien nach %QTDIR%/plugins/designer

Kopieren sämtlicher qwt Header Dateien nach %QTDIR%/include

Kopieren der .lib Dateien nach %QTDIR/lib

Alle Umgebungsvariablen sollten richtig gesetzt sein, insbesondere
QMAKESPEC als win32-msvc2005.

Im Designer sind unter Edit->Preferences
C:/Qt/3.3.6/plugins/designer
C:/Qt/3.3.6/bin
als Pluginpfade gesetzt.
( C:/Qt/3.3.6/plugins habe ich auch ausprobiert. )

Kann mir jemand helfen?

VS findet header nicht

Verfasst: 25. April 2007 02:05
von pitaz
Sorry, hab nicht allzuviel Ahnung von Programmierungund Software. Soll im Rahmen einer Semesterarbeit ein kleines Programm mit QT erstellen und würde gerne die qwt-widgets benutzen.

Habe qwt installiert. Im Command Window kann ich auch alle examples kompillieren. HAB MSVS2005 pro mit qt-integration. Kann jetzt die qwt-widgets auch da im designer auswählen. Beim Kompilieren werden jedoch die zugehörigen Dateien nicht gefunden. Kann mir jemand weiterhelfen. Hab qwt5.dll ins bin-verzeichnis von C:\QT\... kopiert. Muss ich noch mehr machen?