Wie eine Shared Library mit Qt richtig erstellen?
Verfasst: 26. November 2008 09:48
Ich würde gerne mit Qt eine Shared Library (dll) erstellen, bin dabei allerdings auf arge Probleme gestoßen.
Um es besser zu verstehen habe ich zwei einfache Test-Projekte angelegt.
Als erstes soll die lib erstellt werden:
qtseclib.h:
in der entsprechenden qtseclib.cpp stehen nur die fast leeren (De)Konstrutoren
die .pro dazu:
Diese Klasse QtSecLib soll nun in einer App vererbt werden:
qtestapp.h:
Die qtestapp.cpp dazu ist auch wieder fast leer:
und die .pro:
Während unter Ubuntu soweit alles hervorragend funktioniert (natürlich angepasste .pro files) klappt dies unter Windows überhaupt nicht.
Es kommt nur:
Wenn ich die Makros Q_OBJECT entferne und übersetze und laufen lasse ist alles bestens. Programm tut was es soll.
Wenn ich die Makros wieder einfüge und übersetze läuft es immernoch!!!!
Wenn ich dann allerdings ein make clean und dann wieder übersetze geht es wieder nicht mehr. Das soll mal einer verstehen.... Ich jedenfalls nicht...
Also ich habe natürlich viel gesucht und gefunden das man für eine dll noch dies tun sollte:
Ich weiß leider nicht warum oder wie es richtig aussehen sollte, denn leider hat dieser ansatz auch nicht funktioniert....
Also meine Bitte:
Könnte mir jemand erklären wie man mit Qt unter Windoof eine dll (inkl Q_OBJECT) erstellt?
Ich verwende die frisch installierte qt-win-opensource-4.4.3-mingw unter eclipse und mit der Qt Eclipse Integration.
vielen Dank für die Mühe
Vaughn
Um es besser zu verstehen habe ich zwei einfache Test-Projekte angelegt.
Als erstes soll die lib erstellt werden:
qtseclib.h:
Code: Alles auswählen
#ifndef QTSECLIB_H
#define QTSECLIB_H
#include <QtGui>
class QtSecLib : public QWidget
{
Q_OBJECT
public:
QtSecLib(QWidget *parent = 0);
~QtSecLib();
};
#endif // QTSECLIB_H
die .pro dazu:
Code: Alles auswählen
TEMPLATE = lib
TARGET = QtSecLib
QT += core \
gui
HEADERS += qtseclib.h
SOURCES += main.cpp \
qtseclib.cpp
FORMS +=
RESOURCES +=
FORMS +=
Diese Klasse QtSecLib soll nun in einer App vererbt werden:
qtestapp.h:
Code: Alles auswählen
#ifndef QTESTAPP_H
#define QTESTAPP_H
#include <QtGui>
#include "qtseclib.h"
class QTestApp : public QtSecLib
{
Q_OBJECT
public:
QTestApp(QWidget *parent = 0);
~QTestApp();
};
#endif // QTESTAPP_H
Code: Alles auswählen
#include "qtestapp.h"
QTestApp::QTestApp(QWidget *parent) : QtSecLib(parent)
{
QMessageBox::information(this,"Info","QTestApp Construction");
}
QTestApp::~QTestApp()
{
QMessageBox::information(this,"Info","QTestApp Deconstruction");
}
Code: Alles auswählen
TEMPLATE = app
TARGET = QTestApp
QT += core \
gui
HEADERS += qtestapp.h
SOURCES += main.cpp \
qtestapp.cpp
FORMS +=
RESOURCES +=
INCLUDEPATH += c:\workspace\QtSecLib
LIBS += c:\workspace\QtSecLib\debug\QtSecLib.dll
Es kommt nur:
Jetzt noch das witzigste:Die Anwendung konnte nicht richtig initialisiert werden (0xc0000005). ...
Wenn ich die Makros Q_OBJECT entferne und übersetze und laufen lasse ist alles bestens. Programm tut was es soll.
Wenn ich die Makros wieder einfüge und übersetze läuft es immernoch!!!!
Wenn ich dann allerdings ein make clean und dann wieder übersetze geht es wieder nicht mehr. Das soll mal einer verstehen.... Ich jedenfalls nicht...
Also ich habe natürlich viel gesucht und gefunden das man für eine dll noch dies tun sollte:
Code: Alles auswählen
#ifdef BUILD_LIB
#define EXPORT_LIB Q_DECL_EXPORT
#else
#define EXPORT_LIB
#endif
class EXPORT_LIB QtSecLib : public QWidget
Also meine Bitte:
Könnte mir jemand erklären wie man mit Qt unter Windoof eine dll (inkl Q_OBJECT) erstellt?
Ich verwende die frisch installierte qt-win-opensource-4.4.3-mingw unter eclipse und mit der Qt Eclipse Integration.
vielen Dank für die Mühe
Vaughn