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?
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.
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
Öö 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
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.
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