Dlls einbinden



  • Selbst erstellte Dll einbinden und verwenden.

    Ich habe mit dem Projekttyp "Klassenbibliothek" eine DLL erzeugt, mit dem Namen "IsoGame.dll" Dazu gehört der Header "IsoGame.h".
    In einem anderen Projekt möchte ich die nun verwenden(ich habe bislang noch nie mit dlls gearbeitet).

    Ich include also den Header

    #include <SFML/Graphics.hpp>
    #include <SFML/Audio.hpp>
    #include "IsoGame/IsoGame.h"
    
    using namespace IsoGame;
    
    int main() {
    	Karte xyz;
    	xyz.Einheiten[1].setGeschwindigkeit(1);
    }
    

    Die Methode xyz::setGeschwindigkeit kann nun selbstverständlich nicht aufgerufen werden, weil sie in der Dll steht. Fehlermeldung:

    main.obj : error LNK2028: Nicht aufgelöstes Token (0A000275) ""public: void __thiscall IsoGame::Einheit::setGeschwindigkeit(int)" (?setGeschwindigkeit@Einheit@IsoGame@@$$FQAEXH@Z)", auf das in Funktion ""int __cdecl main(void)" (?main@@$$HYAHXZ)" verwiesen wird.
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall IsoGame::Einheit::setGeschwindigkeit(int)" (?setGeschwindigkeit@Einheit@IsoGame@@$$FQAEXH@Z)" in Funktion ""int __cdecl main(void)" (?main@@$$HYAHXZ)".

    Das ist mir auc verständlich, denn ich muss die Dll ja noch irgendwo einbinden.

    Meine Frage:
    Wie binde ich die ein?

    mfg
    Mr. X



  • Es gibt da noch die LIB-Datei. Die brauchst Du auch noch....

    #pragma comment(lib, "IsoGame.lib")
    


  • kenne mich mit dotnet nicht aus aber ich versuchs mal.

    Beim erstellen der dll müsste im selben verzeichnis noch eine .lib datei liegen.
    diese musst du zu deinem Projekt hinzulinken (unter zusätzliche librarys)

    dann noch die .dll in den selben ordner wie das programm kopieren, dann
    sollte es laufen.

    du kannst die dll aber auch ohne lib zur laufzeit laden.

    typedef void (*setGeschwindigkeit)(int);
    HMODULE hdll = LoadLibrary("IsoGame.dll");
    if (!hdll) // fehler...
    {}
    setGeschindigkeit = (void(*)(int))GetProcAddress(hdll, "setGeschwindigkeit");
    if (!setGeschindigkeit) // fehler...
    {}
    // mache was damit
    FreeLibrary(hdll);
    
    allerding musst du bei der methode um die funktionen in der dll einen
    [cpp]extern "C" { /*hier die funktion */ }
    

    block machen



  • Wenn man keine LIB hat, geht es in .NET einfacher mit dem

    DllImportAttribute
    

Anmelden zum Antworten