2011-01-10 6 views
5

ich eine DLL zu schreiben versuchen, das ist, wie meine Header-Datei aussieht:Mit Dllimport Verfahren

#ifndef _DLL_H_ 
#define _DLL_H_ 

#if BUILDING_DLL 
# define DLLIMPORT __declspec (dllexport) 
#else /* Not BUILDING_DLL */ 
# define DLLIMPORT __declspec (dllimport) 
#endif /* Not BUILDING_DLL */ 


DLLIMPORT void HelloWorld (void); 


#endif /* _DLL_H_ */ 

In der CPP-Datei ich diese Header-Datei, und ich versuche, einen DLL-Import-Vorgang erklärt, auf diese Weise :

DLLIMPORT void HelloWorld() 
{ 
    MessageBox (0, "Hello World from DLL!n", "Hi", MB_ICONINFORMATION); 
} 

Aber der Compiler (ich habe auf Windows 7 64-Bit-mingw32) hält mir diesen Fehler geben:

E:\Cpp\Sys64\main.cpp|7|error: function 'void HelloWorld()' definition is marked dllimport| 
E:\Cpp\Sys64\main.cpp||In function 'void HelloWorld()':| 
E:\Cpp\Sys64\main.cpp|7|warning: 'void HelloWorld()' redeclared without dllimport attribute: previous dllimport ignored| 
||=== Build finished: 1 errors, 1 warnings ===| 

Und ich verstehe nicht warum.

+0

Ich habe Ihre beiden Konten zusammengelegt, sodass Sie jetzt eine Antwort akzeptieren können. –

Antwort

3

Die declspec(dllimport) generiert Einträge in der Modul-Import-Tabelle des Moduls. Diese Importtabelle wird verwendet, um die Verweise auf die Symbole zur Verknüpfungszeit aufzulösen. Zur Ladezeit werden diese Referenzen vom Loader festgelegt.

Die declspec(dllexport) generiert Einträge in der DLL-Exporttabelle der DLL. Außerdem müssen Sie Symbole (Funktion, Variablen) implementieren, die deklariert werden.

Da Sie die DLL implementieren, müssen Sie BUILDING_DLL definieren. Dies könnte mit #define getan werden, aber dies sollte besser in den Projekteinstellungen eingestellt werden.

+1

Oder übergeben Sie '/ D BUILDING_DLL' an den Compiler (was ich glaube, ist die häufigere Option) – MSalters

+0

Sie haben Recht. Fügte das zur Antwort hinzu. – harper

2

Ich hatte genau den gleichen Fehler vor der Erkenntnis, dass ich nicht tatsächlich definiert BUILDING_DLL.

Daher wurde DLLIMPORT als definiert und nicht __declspec (dllexport), wie es beabsichtigt war. Nachdem ich das Symbol definiert hatte, war das Problem gelöst.

Da Sie auf MinGW sind, dann müssen Sie folgendes passieren:

-DBUILDING_DLL 

als Compiler-Option oder einfach

#define BUILDING_DLL 

am Anfang der Datei hinzufügen. Ersteres ist besser, verwenden Sie nur die Lösung #define, wenn Sie nicht herausfinden können, wie Sie die Option -DBUILDING_DLL an gcc übergeben.