Von Console zu Dll umwandeln
-
Hallo und guten Abend
Ich hab schon gesucht, aber definitiv was gefunden hab ich nichts.
Ich hoff Ihr könnt mir auf die Sprünge helfen.Ich habe mir eine normale Consolenprogrammierung gemacht, die läuft auch wunderbar ... Nun möchte ich diese 1 zu 1 in eine DLL umwandeln. (So alleinstehend lässt sich das Projekt fehlerfrei kompilieren)
Wenn ich die DLL von einem anderen Projekt (MAIN-PROJEKT) aus mitkompiliere kommt mir immer unten stehende Fehlermeldung.
Ich weiss das static Variablen immer ausserhalb der Symbolbildung deklariert werden müssen .. wie muss es den bei Verwendung als DLL gemacht werden?
Hier noch ein bisserl Code, wo das Problem besteht.
Danke für die Hilfe.
//ObjInitControl.h #pragma once #ifndef __OBJ_INIT_CONTROL_H__ #define __OBJ_INIT_CONTROL_H__ class __declspec(dllexport) ObjInitControls{ private: static bool _init; public: ObjInitControls(){} ~ObjInitControls(){} static void Init(); }; #endif//ObjInitControl.cpp #include "stdafx.h" #include "objInitControls.h" bool ObjInitControls::_init=false; void ObjInitControls::Init(){ if(_init==true)return; //... _init = true; }Fehlermeldung: .... error LNK2001: Nicht aufgelöstes externes Symbol ""private: static bool ObjInitControls::_init" (?_init@ObjInitControls@@0_NA)".
-
Wenn du die DLL-Datei in einem anderen Projekt Verwenden möchstest, und dort den Header einbindest, muss dort in der Klassendefinition
__declspec(dllimport)stehen (und nichtexport). Ich vermute mal dass das die Ursache deines Problems ist. Üblicherweise löst man sowas mithilfe eines Makros, das wenn die DLL kompiliert wird als__declspec(dllexport)und beim Einbinden in ein anderes Proramm als__declspec(dllimport)definiert wird.Ansonsten ist das Ganze eher Compiler-spezifisch und vielleicht besser im Forum zu Visual C++ aufgehoben

Finnegan
-
danke für die Antwort Finnegan
Ich habs ausprobiert ... ist es leider nicht. aber ich werd das nochmals komplett durchgehen ...
Nur eine frage bezüglich makro .. wie meinst du das .. gibs dafür ein tut? ... ich hab jetzt alles von hand gemacht ..
Danke und m.f.g wachs
-
wachs schrieb:
Nur eine frage bezüglich makro .. wie meinst du das .. gibs dafür ein tut? ... ich hab jetzt alles von hand gemacht ..
Gibt sicher auch detailliertere Infos im Netz, aber für den Anfang sollte so twas simples hier reichen:
In einer zentralen Header Datei (z.B. mydll_config.h, etc.):
#if defined(MYDLL_EXPORT) #define MYDLL_API __declspec(dllexport) #else #define MYDLL_API __declspec(dllimport) #endif... und dann in der Klassendeklaration:
#include <mydll_config.h> ... class MYDLL_API ObjInitControls{ ... };Im Projekt das die DLL-Datei kompiliert definiert man dann bei den Präprozessor-Definitionen
MYDLL_EXPORT, bzw. gibt dem Compiler sowas wie-DMYDLL_EXPORTals Option mit auf den Weg. Bei dem Projekt, welches die DLL verwendet tut man das nicht.Das Makro kann man dann natürlich auch noch zwischen verschiedenen Compilern und Zielsystemen unterscheiden lassen, da das Ganze wie gesagt Compiler-spezifisch ist. Dafür fürde ich dann an deiner Stelle mal eine Suchmaschine bemühen.
Finnegan
-
Tatsächlich ... habs jetzt nochmals durchkompiliert .. ist zwar ein bisschen aufwändig und ein paar kleine schnickschnakcs an fehler die ich beheben muss melden sich, aber ansonsten läst sich das komplett kompilieren...
D.H. eigenständiges Projekt als dllexport kompilieren und nachher vom Main-Projekt aus kurz umgeschrieben zu dllimport und Gesamtkompilierung gemacht .. UNd es läuft ..
...Versteh zwar jetzt nicht genau warum das so ist aber ich werd mir das nochmals zu gemüüte führen ..

gruss wachs
-
-
Danke euch ... das war wieder voll lehrreich ...
Gruss wachs