[SOLVED] Fehler bei eigenem Widget Plugin

Alles rund um die Programmierung mit Qt
Antworten
mark93
Beiträge: 26
Registriert: 6. August 2009 11:50

[SOLVED] Fehler bei eigenem Widget Plugin

Beitrag 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
Zuletzt geändert von mark93 am 20. Juli 2010 19:52, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

QDESIGNER_WIDGET_EXPORT ist ja nun auch wirklich nicht korrekt... siehe Foren-Suche nach Q_DECL_EXPORT
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mark93
Beiträge: 26
Registriert: 6. August 2009 11:50

Beitrag 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
mark93
Beiträge: 26
Registriert: 6. August 2009 11:50

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wie benutzt Du nun Q_DECL_EXPORT/Q_DECL_IMPORT?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mark93
Beiträge: 26
Registriert: 6. August 2009 11:50

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Beim erstellen der Lib muss dann natürlich auch GUILIB_LIBRARY gesetzt sein.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
mark93
Beiträge: 26
Registriert: 6. August 2009 11:50

Beitrag 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
khrl01
Beiträge: 28
Registriert: 28. August 2007 13:06

Beitrag 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
mark93
Beiträge: 26
Registriert: 6. August 2009 11:50

Beitrag von mark93 »

Danke karl-heinz, ich habe nicht an die möglichen Präprozessor Definitionen gedacht :roll: .

Gruß,

mark
Antworten