Makro für dllexport/dllimport-Schalter

Lesezeit: 4 Minuten

Makro fur dllexportdllimport Schalter
Blub

#if COMPILING_DLL
    #define DLLEXPORT __declspec(dllexport)
#else
    #define DLLEXPORT __declspec(dllimport)
#endif

Wie / wo definiere ich COMPILING_DLL ?

Hier zu sehen: Was bedeutet __declspec(dllimport) wirklich?

Klingt so, als könnte ich die dynamische Verknüpfung zur Ladezeit überhaupt nicht verwenden, wenn ich nicht denselben Header verwenden kann?

Geben Sie hier die Bildbeschreibung ein

  • Scheint, dass Sie irgendwo einen seltsamen Fehler haben, der hier nicht erwähnt wird. Seien Sie versichert, es sollte funktionieren, DLLs sind sehr nützlich.

    – Öö Tiib

    20. Februar 2013 um 16:06 Uhr

  • sehen docs.microsoft.com/en-us/cpp/build/…

    – GreatAndPowerfulOz

    1. Oktober 2020 um 14:51 Uhr


Eine andere Option:

Verwenden Sie die Ursprünglich definiertes Makro lokal zum Projekt.

Sie können die standardmäßig definierten Makros lokal für das Projekt an der folgenden Stelle sehen:

Eigenschaften -> C/C++ -> Präprozessor -> Präprozessordefinition.

Beispiel:

Angenommen, Ihr Projektname lautet: MeineDLL

Default Macro Local für dieses 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

  • Es ist eine Schande, dass der nützlichste Code zum Kopieren in diese Frage nicht in der akzeptierten Antwort enthalten ist. Wenigstens hast du es hier für uns 🙂

    – kayleeFrye_onDeck

    6. November 2018 um 5:18 Uhr

  • @kayleeFrye_onDeck dieser Code ist bereits in Frage.

    – Öö Tiib

    28. Juli 2020 um 16:04 Uhr

  • Sobald ich eine DLL erstellt habe, bleibt MYDLL_EXPORTS gesetzt, auch wenn ich sie in einem anderen Projekt verwende, während es hier nicht gesetzt sein sollte. Kann mir bitte jemand sagen warum das so ist???

    – aki_sud

    5. April 2021 um 14:36 ​​Uhr

1646312411 541 Makro fur dllexportdllimport Schalter
Öö Tiib

Der beste Ort zum Definieren COMPILING_DLL=1 ist die Befehlszeile des Compilers. Wenn Sie Visual Studio IDE verwenden, befindet es sich in Projekteigenschaften … C/C++ … Präprozessor … Präprozessordefinitionen.

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

  • Ich habe COMPILING_DLL zu den Präprozessordefinitionen hinzugefügt, aber es beschwert sich immer noch über “Fehler C2491: ‘test2’: Definition der dllimport-Funktion nicht zulässig”. Was keinen Sinn macht, weil Visual Studio jetzt sogar die richtige ausgraut. Ich habe einen Screenshot hinzugefügt, um dies zu veranschaulichen.

    – Blubb

    20. Februar 2013 um 13:29 Uhr


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

    – Öö Tiib

    20. Februar 2013 um 16:00 Uhr


Im DLL-Projekt fügen Sie eine #define (entweder in einer Header-Datei oder in den Projekteigenschaften) für COMPILING_DLL. Da dies für kein anderes Projekt festgelegt wird (insbesondere wenn Sie es besser nennen als COMPILING_DLL) dann ist die #if Direktive wird richtig funktionieren.

Sie (eigentlich Visual Studio im Idealfall) definieren die COMPILING_DLL als Argument für den Compiler, wenn Sie die DLL erstellen. Es wird also standardmäßig verwendet __declspec(dllexport). Wenn Sie andererseits die Header-Datei der DLL VERWENDEN, definieren Sie dies nicht, also DLLEXPORT wird standardmäßig auf ausgewertet __declspec(dllimport).

Sie können den Funktionsrumpf nicht auf diese Weise in der Header-Datei definieren. es ist verboten durch __declspec(dllimport). Dieser Bezeichner kann nur bei der Funktionsdeklaration angegeben werden, nicht bei der Definition.

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

in Header-Datei:

extern DLLEXPORT void test2();

In .cpp-Datei:

void test2()
{
   // ...
}

Wie gesagt, vergessen Sie nicht, COMPILING_DLL zu den Präprozessordefinitionen des Projekts hinzuzufügen.

  • Die Quelle des von Ihnen erwähnten Compilerfehlers (“Fehler C2491: ‘test2’: Definition der dllimport-Funktion nicht zulässig”) war dies. Aber es scheint, dass es durch explizites Verwenden gelöst werden kann #define COMPILING_DLL im Code, anstatt es hinzuzufügen zu: Project>properties>C/C++>Preprocessor>Preprocessor Definitions

    – Masood Khaari

    20. Februar 2013 um 14:44 Uhr

1646312412 962 Makro fur dllexportdllimport Schalter
Manuel Garnier

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

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

  • Die Quelle des von Ihnen erwähnten Compilerfehlers (“Fehler C2491: ‘test2’: Definition der dllimport-Funktion nicht zulässig”) war dies. Aber es scheint, dass es durch explizites Verwenden gelöst werden kann #define COMPILING_DLL im Code, anstatt es hinzuzufügen zu: Project>properties>C/C++>Preprocessor>Preprocessor Definitions

    – Masood Khaari

    20. Februar 2013 um 14:44 Uhr

Wenn Sie CMake zum Generieren Ihrer Build-Konfiguration verwenden, sollten Sie das Makro verwenden können <projectname>_EXPORTS wie Sie es verwenden möchten COMPILING_DLLwo projectname wurde mit dem CMake-Befehl definiert project(projectname):

Ein Präprozessor-Makro, <target_name>_EXPORTS wird definiert, wenn eine gemeinsam genutzte Bibliothekskompilierung erkannt wird.

Quelle

Ich habe es getestet und es funktioniert unter Windows mit dem Ninja-Generator mit dem Compiler MSVC von Visual Studio 2015 Express.

Verwandt: CMake fügt -Dlibname_EXPORTS-Kompilierungsdefinition hinzu

923630cookie-checkMakro für dllexport/dllimport-Schalter

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy