Seite 1 von 1

Qt + MSVS2008 + dll

Verfasst: 11. Juni 2010 10:17
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?

Verfasst: 11. Juni 2010 10:35
von Christian81
Beim erzeugen sollten man dann schon MYSOURCEDLL definieren.

Verfasst: 11. Juni 2010 10:37
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.

Verfasst: 11. Juni 2010 11:03
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?!

Verfasst: 11. Juni 2010 11:10
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.