VS2010 - DLL Erstellung und Verwendung
-
Hallo Gemeinde,
ich habe ein Problem mit der Erstellung und Verwendung einer DLL. Es ist mein erster Versuch und ich blicke einfach nicht richtig durch, im Internet habe ich mehrere Ansetze gefunden, aber den gemeinsamen Nenner konnte ich nicht finden.
Ich habe eine Registry geschrieben, welche alle Informationen von meiner *.ini Config-File enthält. Da ich den Code nun für andere Programme benötige dachte ich mir DLL ist eine gute Lösung. Hier habe ich eine abgespeckte form meiner Klasse.
registry.hpp
#ifndef G5_CONF_REGISTRY_HPP #define G5_CONF_REGISTRY_HPP #ifdef DLL_EXPORT #define DECLDIR __declspec(dllexport) #else #define DECLDIR __declspec(dllimport) #endif #include <string> #include <vector> using namespace std; namespace g5 { namespace conf { struct entry { string name; string value; }; struct category { string name; vector<entry> entries; }; typedef vector<category> category_list; class DECLDIR registry { category_list category_list_; int crt_category_; int crt_entry_; private: int category_is_valid(); int entry_is_valid(); public: registry(); void clear_all(); string get_entry_name();Wenn ich die DLL nun verwenden will, bekomme ich folgenden compiler Fehler. Ich habe keine Ahnung wie ich den lösen kann.
main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall g5::conf::registry::get_entry_name(void)" (__imp_?get_entry_name@registry@conf@g5@@QAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) referenced in function "void __cdecl print_ini_file(class g5::conf::registry &)" (?print_ini_file@@YAXAAVregistry@conf@g5@@@Z)So richtig verstehe ich das nicht mit dem __declspec(dllexport) oder __declspec(dllimport).
Hat jemand ein HowTo oder einen Artikel zu dem Thema?Danke für die Hilfe
so long
-
Beim Kompilieren der DLL musst du Klassen und Funktionen exportieren, dazu dient
__declspec(dllexport). Wenn du hingegen die DLL-Datei in einem Projekt verwendest, musst du ihre Symbole importieren, was mit__declspec(dllimport)erreicht werden kann.Stelle sicher, dass das Makro
DLL_EXPORTbeim Erzeugen der dynamischen Bibliothek definiert ist, beim Verwenden aber nicht. Und natürlich mussget_entry_name()eine Definition haben.Für genauere Informationen zu dynamischen Bibliotheken könntest du dir einmal MSDN anschauen.