Qt + MSVS2008 + dll

Alles rund um die Programmierung mit Qt
Antworten
stardust5383
Beiträge: 28
Registriert: 31. Oktober 2009 10:36

Qt + MSVS2008 + dll

Beitrag von stardust5383 »

Hallo zusammen,

ich habe ein Projekt von mir, was ich gerne in eine dll auslagern möchte. Die ersten Schritte haben alle einwandfrei funktioniert, aber nun habe ich Signale innerhalb meiner dll definiert und komme mit der Fehlermeldung einfach nicht mehr weiter.

Erst das Beispiel:

Code: Alles auswählen

// mysourcedll_global.h

#ifndef MYSOURCEDLL_GLOBAL_H
#define MYSOURCEDLL_GLOBAL_H

#include <Qt/qglobal.h>

#ifdef MYSOURCEDLL
# define MYSOURCEAPI Q_DECL_EXPORT
#else
#  define MYSOURCEAPI Q_DECL_IMPORT

#endif

#endif // MYSOURCEDLL_GLOBAL_H
Das ist die Headerdatei, mit der ich den DLL Export vornehme. Diese ist in allen Klassen, die ich exportieren will eingebunden.

Hier die Klasse:

Code: Alles auswählen

// mysourcedll.h

//#pragma once
#ifndef MYSOURCEDLL_H
#define MYSOURCEDLL_H

#include "mysourcedll_global.h"

/****************************************************************************************/
/***								Includes	   									  ***/
/****************************************************************************************/
#include <QString>
#include <QThread>
#include <QDebug>
#include <QObject>

class MYSOURCEAPI MySourceDLL: public QObject
{
	Q_OBJECT
	
private:
    // ...

public:
   MySourceDLL(void);

   ~MySourceDLL(void);

   void foo1(void);

   bool foo2(void);

   int foo3(void);

signals:
  void connected(bool bSuccess);

};
Hier die zugehörige CPP

Code: Alles auswählen

#pragma once
#include "mysourcedll.h"

MySourceDLL::MySourceDLL(void)
{
   //....

  emit connected(true);
}

void MySourceDLL::foo1(void)
{
   //...
}

bool MySourceDLL::foo2(void)
{
   //...
   emit connected(false)
   return true;
}

int MySourceDLL::foo3(void)
{
   //...
   return 0;
}
Wenn ich meinen Code nach dieser Struktur kompiliere (MSVC Compiler mit Qt 4.6.2 und Qt Add-In) erhalte ich zu einen für alle Methoden der Klasse inkonsistente DLL-Bindungen, zum anderen einen Fehler mit folgender Meldung:
1>.\GeneratedFiles\Debug\moc_mysourcedll.cpp(47) : warning C4273: 'staticMetaObject': Inkonsistente DLL-Bindung.
1> c:\projekte\mysourcedll\generatedfiles\debug\../../mysourcedll.h(26): Siehe vorherige Definition von 'public: static QMetaObject const MySourceDLL::staticMetaObject'
1>.\GeneratedFiles\Debug\moc_mysourcedll.cpp(47) : error C2491: 'MySourceDLL::staticMetaObject': Definition von Statisches Datenmember für dllimport nicht zulässig
1>.\GeneratedFiles\Debug\moc_mysourcedll.cpp(57) : warning C4273: 'MySourceDLL::metaObject': Inkonsistente DLL-Bindung.
1> c:\projekte\mysourcedll\generatedfiles\debug\../../mysourcedll.h(26): Siehe vorherige Definition von 'metaObject'
1>.\GeneratedFiles\Debug\moc_mysourcedll.cpp(62) : warning C4273: 'MySourceDLL::qt_metacast': Inkonsistente DLL-Bindung.
1> c:\projekte\mysourcedll\generatedfiles\debug\../../mysourcedll.h(26): Siehe vorherige Definition von 'qt_metacast'
1>.\GeneratedFiles\Debug\moc_mysourcedll.cpp(70) : warning C4273: 'MySourceDLL::qt_metacall': Inkonsistente DLL-Bindung.
1> c:\projekte\mysourcedll\generatedfiles\debug\../../mysourcedll.h(26): Siehe vorherige Definition von 'qt_metacall'
1>.\GeneratedFiles\Debug\moc_mysourcedll.cpp(88) : warning C4273: 'MySourceDLL::connected': Inkonsistente DLL-Bindung.
1> c:\projekte\mysourcedll\generatedfiles\debug\../../mysourcedll.h(155): Siehe vorherige Definition von 'connected'
1>.\GeneratedFiles\Debug\moc_mysourcedll.cpp(95) : warning
...
...
...
Was mache ich falsch bzw. wo liegt mein Fehler?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Beim erzeugen sollten man dann schon MYSOURCEDLL definieren.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
stardust5383
Beiträge: 28
Registriert: 31. Oktober 2009 10:36

Beitrag von stardust5383 »

Und wo definiere ich das?
Sorry für die Frage, aber ich habe leider noch nicht so die Erfahrung mit der DLL Entwicklung.
stardust5383
Beiträge: 28
Registriert: 31. Oktober 2009 10:36

Beitrag von stardust5383 »

Ok, bei einem Projekt mit QTCreator kommt dieser Define in die .pro Datei (DEFINES += MYSOURCEDLL), aber wo gebe ich diesen bei einem Visual Studio Projekt an? Da habe ich ja erst einmal keine .pro Datei?!
stardust5383
Beiträge: 28
Registriert: 31. Oktober 2009 10:36

Beitrag von stardust5383 »

Problem selbst gelöst - Google Dein Freund und Helfer:

Definieren von MYSOURCEDLL unter Projekteigenschaften/C++/Befehlszeile

dann in zusätzliche Optionen folgendes eingetragen:

/D "MYSOURCEDLL"

Problem beseitigt, dll hat kompiliert ohne Warnungen und Fehler.
Antworten