Problem mit Klasse in DLL
-
Ich implementiere in einer DLL eine Klasse. Die Deklaration dieser Klasse wird sowohl von der DLL als auch vom Hauptprogramm includiert. Ich exportiere genau eine Funktion, die eine Instanz auf besagt Klasse zurück gibt.
Warum bekomme ich bei jedem Call eins der Member eine fehlermeldung a la "MyClass::func() referenced from ...obj..."
-
Ich versteh nur nicht warum du dafür ne Funktion verwendest?
Mach doch die ganze Klasse export.
Siehe Beispiel:
io.h:#ifdef __DLL__ # define DLL_EXP __declspec(dllexport) #else # define DLL_EXP __declspec(dllimport) #endif class DLL_EXP TBeispiel{ };Da mußte dann nur die header einbinden mehr net. Für import mußt du dich net kümmern, durch das ifdef....endif
Somit brauchst du auch keine Funktion schreiben....
Achja, falls die dll statisch verwendet wird, soltest du auch die .lib einbinden in das projekt. ^^
-
Wieso macht es bei der dll ein unterschied ob ich einen header einbinde oder sie gleich hineinschreibe?
-
Als ich die Objektdatei der dll gelinkt habe, ging es ebenfalls...
-
PS: Lassen sich etwa auch Klassendeklarationen exportieren? Die haben aber doch keine Adresse usw... ?!?!?
-
Lassen sich etwa auch Klassendeklarationen exportieren? Die haben aber doch keine Adresse usw... ?!?!?
Ja, die habe auch sonst keine "Adresse" erst durch
KLasse myclass
oder
Klasse *myclass=new Klasse()
wird eine Instanz mit einer Adresse angelegt
-
Wieso hat es denn funktioniert als ich die .obj Datei vom Dll zu meinem Hauptprojekt gelinkt habe? Und is das von der größe her dann nicht doppelt gemoppelt?
-
Ok... es ist definitiv doppelt gemoppelt. Jetzt nochmal das ganze Problem:
Der gemeinsame Haeder:
class MyClass{ public: void func(void); };Die DLL:
void MyClass::func(void) { ... } extern "C" __declspec(dllexport) MyClass *WINAPI GibMirMyClass(void) { return new MyClass(); }Das Hauptprogramm:
typedef MyClass* (* MyClassPtr)(void); int main(int argc, char* argv[]) { HMODULE MyClassLib; MyClassPtr GibMirMyClassFunction = NULL; MyClassLib = LoadLibrary("engine\\MyClass.dll"); if(MyClassLib == NULL){ //Fehler... ... } GibMirMyClassFunction = (MyClassPtr)GetProcAddress(MyClassLib, "GibMirMyClass"); if(GibMirMyClassFunction == NULL){ //Fehler... ... } MyClass *Juhu = GibMirMyClassFunction(); Juhu->func(); //Hier ist der Fehler ... }Ich binde wie man sieht dynamisch ein. Die Lib ist mitgelinkt. Jedoch kriege ich bei jedem Call eines Members von MyClass eine fehlermeldung wie:
[Linker Error] Unresolved external 'MyClass::func()' referenced from G:\...\MAIN.OBJIch hoffe jetzt könnt ihr mir besser helfen.
-
Hat keiner eine Idee?
-
Warum nimmst du nicht endlich das Beispiel von DJ BlackEagle
als Grundlage?