2013-02-20 13 views
5
#if COMPILING_DLL 
    #define DLLEXPORT __declspec(dllexport) 
#else 
    #define DLLEXPORT __declspec(dllimport) 
#endif 

Wie/wo definiere ich COMPILING_DLL?Makro für dllexport/dllimport switch

hier gesehen: what does __declspec(dllimport) really mean?

Klingt wie ich nicht die Ladezeit dynamische Verknüpfung überhaupt, wenn ich den gleichen Header verwenden, kann nicht verwenden kann?

enter image description here

+0

Es scheint, dass Sie einige seltsame Fehler irgendwo das wird hier nicht erwähnt. Seien Sie versichert, es sollte funktionieren, DLLs sind sehr nützlich. –

Antwort

8

Der beste zu definierende Punkt COMPILING_DLL=1 ist die Befehlszeile des Compilers. Wenn Sie Visual Studio IDE verwenden, dann ist es in Projekteigenschaften ... C/C++ ... Präprozessor ... Präprozessor Definitionen.

__declspec(dllimport) ist Microsoft spezifische Erweiterung zu C++. Microsoft verfügt über eine hervorragende Online-Dokumentation.

+1

Ich habe COMPILING_DLL zu den Preprozessor-Definitionen hinzugefügt, aber es klagt immer noch "Fehler C2491: 'test2': Definition der Dllimport-Funktion nicht erlaubt". Was keinen Sinn ergibt, da Visual Studio jetzt sogar den richtigen ausgraut. Ich habe einen Screenshot hinzugefügt, um dies zu veranschaulichen. – Blub

+0

es funktioniert, wenn ich es manuell mache '#define COMPILING_DLL 1' – Blub

+0

Sie sollten diese COMPILING_DLL zu Präprozessordefinitionen Ihres DLL-Projekts hinzufügen. Wenn Sie diesen Header im vorkompilierten Header dieses Projekts enthalten, stellen Sie sicher, dass Sie ihn neu erstellen. –

2

Im DLL-Projekt, können Sie ein #define (entweder in einer Header-Datei oder in den Projekteigenschaften) für COMPILING_DLL hinzufügen. Da dies für kein anderes Projekt festgelegt wird (insbesondere wenn Sie es besser als COMPILING_DLL benennen), funktioniert die Direktive #if ordnungsgemäß.

2

Sie (eigentlich Visual Studio im Idealfall) definiert die COMPILING_DLL als ein Argument für den Compiler beim Erstellen der DLL. Daher wird standardmäßig __declspec(dllexport) angezeigt. Wenn Sie andererseits die Header-Datei der DLL verwenden, definieren Sie dies nicht, daher wird DLLEXPORT standardmäßig als __declspec(dllimport) ausgewertet.

0

Sie können den Funktionskörper in der Header-Datei nicht so definieren. Es ist prohibited by __declspec(dllimport). Dieser Spezifizierer kann nur für die Funktionsdeklaration und nicht für die Definition angegeben werden.

Sie müssen den Funktionskörper in eine Quelldatei verschieben.

in Header-Datei:

extern DLLEXPORT void test2(); 

In CPP-Datei:

void test2() 
{ 
    // ... 
} 

Wie Leute gesagt, vergessen Sie nicht COMPILING_DLL den Projekt Präprozessordefinitionen hinzuzufügen.

+0

funktioniert es aber, VS2010. – Blub

+0

Die Quelle des Compiler-Fehlers, die Sie erwähnt haben ("Fehler C2491: 'test2': Definition der Dllimport-Funktion nicht erlaubt") war dies. Aber es scheint, dass es gelöst werden kann, indem Sie '#define COMPILING_DLL' explizit im Code verwenden, anstatt es hinzuzufügen: Projekt> Eigenschaften> C/C++> Präprozessor> Präprozessor-Definitionen –

1

Eigentlich ist das eigentliche Problem die Präprozessordirektive. Sie sollten #ifdef und nicht #if verwenden, um zu testen, ob die Variable wirklich definiert ist (und wir kümmern uns nicht um den definierten Wert oder wenn es einen gibt).

HINWEIS: Ich weiß, dieser Thread ist 1 Jahr alt, aber es kann immer noch nützlich sein für jemanden, der dieses Problem in der Zukunft haben.

4

Eine weitere Option:

Verwenden Sie die Standard Makro definiert lokalen für das Projekt.

Sie können die Standard definierten Makros lokal für das Projekt in der folgenden Stelle sehen:

Eigenschaften -> C/C++ -> Preprocessor -> Preprocessor Definition.

Beispiel:

Angenommen, Ihr Projektname ist: MyDLL

Standard Macro Lokale zu diesem Projekt: MYDLL_EXPORTS

#ifdef MYDLL_EXPORTS 
    /*Enabled as "export" while compiling the dll project*/ 
    #define DLLEXPORT __declspec(dllexport) 
#else 
    /*Enabled as "import" in the Client side for using already created dll file*/ 
    #define DLLEXPORT __declspec(dllimport) 
#endif