Seite 1 von 1

[SOLVED] Fehler bei eigenem Widget Plugin

Verfasst: 16. Juli 2010 16:17
von mark93
Moin,

ich habe mir die Tage mal die Demo für benutzerdefinierte Fenster Plugins angeschaut und wollte selbst mal eins erstellen. Nach zig Fehlern und überarbeiteten Einstellungen bin ich jetzt an folgendem Punkt:
Alle Quelldateien sind fehlerfrei kompiliert, moc ist über die Headers gelaufen. Nur bei einer moc Datei hat er jetzt Probleme beim Kompilieren:
1>moc_SFeld.cpp(40): warning C4273: 'staticMetaObject': Inkonsistente DLL-Bindung.
1> c:\dokumente und einstellungen\mark\eigene dateien\tacticstudios\trunk\src\gui\SFeld.h(12): Siehe vorherige Definition von 'public: static QMetaObject const MT::GUI::SFeld::staticMetaObject'
1>moc_SFeld.cpp(40): error C2491: 'MT::GUI::SFeld::staticMetaObject': Definition von Statisches Datenmember für dllimport nicht zulässig
1>moc_SFeld.cpp(50): warning C4273: 'MT::GUI::SFeld::metaObject': Inkonsistente DLL-Bindung.
1> c:\dokumente und einstellungen\mark\eigene dateien\tacticstudios\trunk\src\gui\SFeld.h(12): Siehe vorherige Definition von 'metaObject'
1>moc_SFeld.cpp(55): warning C4273: 'MT::GUI::SFeld::qt_metacast': Inkonsistente DLL-Bindung.
1> c:\dokumente und einstellungen\mark\eigene dateien\tacticstudios\trunk\src\gui\SFeld.h(12): Siehe vorherige Definition von 'qt_metacast'
1>moc_SFeld.cpp(63): warning C4273: 'MT::GUI::SFeld::qt_metacall': Inkonsistente DLL-Bindung.
1> c:\dokumente und einstellungen\mark\eigene dateien\tacticstudios\trunk\src\gui\SFeld.h(12): Siehe vorherige Definition von 'qt_metacall'
1> SFeld.cpp
1>SFeld.cpp(8): warning C4273: 'MT::GUI::SFeld::SFeld': Inkonsistente DLL-Bindung.
1> c:\dokumente und einstellungen\mark\eigene dateien\tacticstudios\trunk\src\gui\SFeld.h(15): Siehe vorherige Definition von '{ctor}'
Ich entwickle momentan unter VS 2010 ( das hat mich schon einige Nerven mit Qt gekostet, aber mittlerweile gehts :D ), jedoch kann die Version nicht der Fehler sein, weil der ist Hier schon mal aufgetaucht.

Code: Alles auswählen

#ifndef MT_GUI_SFELD_H
#define MT_GUI_SFELD_H
#include <QWidget.h>
#include <QtDesigner/QDesignerExportWidget.h>

namespace MT
{
	namespace GUI {

		class QDESIGNER_WIDGET_EXPORT SFeld : public QWidget
		{
			Q_OBJECT

		public:
			SFeld(QWidget* parent = 0);
		};
	}
}

#endif //MT_GUI_SFELD_H

Code: Alles auswählen

/****************************************************************************
** Meta object code from reading C++ file 'SFeld.h'
**
** Created: Fri 16. Jul 15:48:56 2010
**      by: The Qt Meta Object Compiler version 62 (Qt 4.6.2)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/

#include "SFeld.h"
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'SFeld.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 62
#error "This file was generated using the moc from 4.6.2. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif

QT_BEGIN_MOC_NAMESPACE
static const uint qt_meta_data_MT__GUI__SFeld[] = {

 // content:
       4,       // revision
       0,       // classname
       0,    0, // classinfo
       0,    0, // methods
       0,    0, // properties
       0,    0, // enums/sets
       0,    0, // constructors
       0,       // flags
       0,       // signalCount

       0        // eod
};

static const char qt_meta_stringdata_MT__GUI__SFeld[] = {
    "MT::GUI::SFeld\0"
};

const QMetaObject MT::GUI::SFeld::staticMetaObject = {
    { &QWidget::staticMetaObject, qt_meta_stringdata_MT__GUI__SFeld,
      qt_meta_data_MT__GUI__SFeld, 0 }
};

#ifdef Q_NO_DATA_RELOCATION
const QMetaObject &MT::GUI::SFeld::getStaticMetaObject() { return staticMetaObject; }
#endif //Q_NO_DATA_RELOCATION

const QMetaObject *MT::GUI::SFeld::metaObject() const
{
    return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;
}

void *MT::GUI::SFeld::qt_metacast(const char *_clname)
{
    if (!_clname) return 0;
    if (!strcmp(_clname, qt_meta_stringdata_MT__GUI__SFeld))
        return static_cast<void*>(const_cast< SFeld*>(this));
    return QWidget::qt_metacast(_clname);
}

int MT::GUI::SFeld::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QWidget::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    return _id;
}
QT_END_MOC_NAMESPACE
Wenn ihr sonst noch source braucht, bitte Bescheid sagen.

Gruß,

mark

Verfasst: 16. Juli 2010 16:39
von Christian81
QDESIGNER_WIDGET_EXPORT ist ja nun auch wirklich nicht korrekt... siehe Foren-Suche nach Q_DECL_EXPORT

Verfasst: 16. Juli 2010 17:19
von mark93
Vielen Dank jetzt lässt sichs einwandfrei kompilieren, leider noch nicht als Plugin benutzten:
Das Plugin 'C:/Qt/plugins/designer/GUI.dll' verwendet eine inkompatible Qt-Bibliothek. (Im Debug- bzw. Release-Modus erstellte Bibliotheken können nicht zusammen verwendet werden.)
Ich tippe mal i-was stimmt mit meinen Projekteinstellungen nicht. Hat sich mittlerweile erledigt.

Ich verstehe zwar nur noch nciht ganz, warum das Makro oben falsch war, obwohl die Demo das ja auch benutzte, aber ich werd mich die Tage mal schlau machen und die SUFU ausgiebig benutzten.

Gruß und schönes We,

mark

Verfasst: 19. Juli 2010 23:34
von mark93
n'Abend,

ich habe das Plugin nun fertig geschrieben und es funktioniert soweit wunderbar, im Editor, jedoch habe ich Probleme beim verwenden des Widgets. Ich habe die *.lib und die include-Verweise für die Klasse zwar richtig gesetzt, doch er versucht jetzt beim kompilieren in meinem Hauptprojekt auch eine *.lib bzw. *.exp zu erstellen. Wenn ich aber dieses Widget nicht benutzte funktioniert alles tadellos.

Wenn das schon i-wo erklärt wurde und ich es nicht gefunden habe, reicht mir auch ein Link oder ein Suchbegriff.

Vielen Dank im Vorraus!

mark

Verfasst: 20. Juli 2010 06:48
von Christian81
Wie benutzt Du nun Q_DECL_EXPORT/Q_DECL_IMPORT?

Verfasst: 20. Juli 2010 11:46
von mark93
Ich habe mir das ganze nochmal auf deine Frage hin angeschaut und etwas umgeschrieben, jetzt ist es jedoch so, dass ich die lib nciht mehr erstellen kann.

Meine global Header sieht so aus:

Code: Alles auswählen

#include <QtCore/QtGlobal>

 #if defined(GUILIB_LIBRARY)
 #  define GUILIB_EXPORT Q_DECL_EXPORT
 #else
 #  define GUILIB_EXPORT Q_DECL_IMPORT
 #endif
Die Frage ist, wie kann ich in VS ohne *.pro Datei die Makros nach meinem Willen setzten . Mittlerweile , ich gebs ja zu :D , hat sich die Frage doch etwas von dem Titel bzw. Qt entfernt, ich würde mich trotzdem über eine Antwort freuen.

Gruß,

mark

Verfasst: 20. Juli 2010 12:20
von Christian81
Beim erstellen der Lib muss dann natürlich auch GUILIB_LIBRARY gesetzt sein.

Verfasst: 20. Juli 2010 14:23
von mark93
Ja das war mir bewusst ich wollte eher darauf hinaus, ob es nicht von Qt oder VS ein Makro gibt, welches etwas über die Art des Projekts (DLL /EXE) sagt, damit automatisch zwischen EXPORT/IMPORT gewechselt werden kann. Aber es funktioniert alles soweit, deswegen noch mal ein Danke an dich für deine Hilfe.

Gruß,

mark

Verfasst: 20. Juli 2010 16:18
von khrl01
Das ist doch ganz einfach....
Du musst in den Projekteinstellungen den Parameter GUILIB_LIBRARY definieren. Dann ist dieser Parameter beim Bauen der DLL gesetzt -> Interfaces werden exportiert.
Der Benutzer dieser DLL hat dieses Define nicht gesetzt -> Interfaces werden importiert...

karl-heinz

Verfasst: 20. Juli 2010 19:51
von mark93
Danke karl-heinz, ich habe nicht an die möglichen Präprozessor Definitionen gedacht :roll: .

Gruß,

mark