DLL: Instanzierung von Klassen ohne Quelldatei?



  • Hallo,
    zur Zeit arbeite ich an meiner kleinen eigenen Engine. Um später komfortabel ein neues Spiel erstellen zu können, stelle ich mir in etwa so etwas vor:

    #include <MyEngine.hpp>
    
    using namespace MyEngine;
    
    int main(int argc, char **argv)
    {
        Application app(argc, argv); // um diese Zeile geht es
        // mach irgendwas
    
        return app.Run();
    }
    

    Wie man sieht, versuche ich in meinem Spiel eine Instanz der Klasse Application zu erstellen.
    Mein Problem ist nun, dass dies nur gelingt, wenn ich die Application.cpp einbinde.
    Somit müsste sie jedes mal neu erstellt werden.
    Da dies an mehreren Stellen auftritt, möchte ich das gerne vermeiden, und nur die Headerdateien, die .dll und die .lib ausliefern.

    Wie realisiere ich das?

    Gruß und Danke!



  • Hast du mal in Qt programmiert ?



  • Kompiliere deine Engine statt zu einer Anwendung (.exe) zu einer statischen (.lib) oder einer dynamischen (.lib + .dll) Bibliothek. Wie das genau funktioniert, steht in der Dokumentation deines Compilers. Im entsprechenden Unterforum bist du besser aufgehoben.

    P.S.: Ich würde unbedingt Namensräume benutzen.



  • statischen (.lib) oder einer dynamischen (.lib + .dll) Bibliothek

    Das tue ich bereits. Und mehr ist nicht nötig? Ich werde es nachher mal testen. Aber ich meine, dass ich dann einen Linkererror bekommen habe, dass Application undefinierte Symbole hat bzw. selbst eines ist.

    Hast du mal in Qt programmiert ?

    Nein, dass war nur ein Beispiel. Ich weiß, dass es Qt ähnlich sieht.

    P.S.: Ich würde unbedingt Namensräume benutzen.

    Habe ich doch getan. Oder meinst du, dass ich jedes mal MyEngine:: davor schreiben sollte? Oder noch besser, mehrere, verschachtelte Namensräume?



  • Hast du die "lib"-Datei denn auch zu deinem Projekt hinzugelinkt?
    Bzw. den korrekten Pfad zu der Datei angegeben?



  • theliquidwave schrieb:

    Oder meinst du, dass ich jedes mal MyEngine:: davor schreiben sollte?

    Ja. Namensräume zu schreiben, nur um sie jedes Mal mit using namespace wieder auszuleeren, macht nur begrenzt Sinn. Dein Namensraum-Bezeichner kann ja auch eine Abkürzung mit 2-5 Buchstaben sein.

    theliquidwave schrieb:

    Oder noch besser, mehrere, verschachtelte Namensräume?

    Würde ich nur, falls von der Gliederung einen Vorteil hast.



  • So, habe es mal getestet. Folgendes Problem: Es wird erst eine .lib-Datei erstellt, wenn ich irgendwo in der DLL ein __declspec(dllexport) verwende.

    Das sagt mir

    a) dass die .lib nur externe Verweise enthält
    b) sie keine Klassenimplementationen enthält

    Wie schon befürchtet gibt es einen Linkererror, wenn ich eine Instanz von Application erstellen will.

    Muss ich irgendwas umstellen?



  • theliquidwave schrieb:

    Folgendes Problem: Es wird erst eine .lib-Datei erstellt, wenn ich irgendwo in der DLL ein __declspec(dllexport) verwende.

    Natürlich, sonst exportierst du ja keine Symbole und brauchst entsprechend keine Import-Bibliothek (.lib-Datei).

    theliquidwave schrieb:

    Muss ich irgendwas umstellen?

    Ja, __declspec(dllimport) . Auf MSDN wird der ganze Prozess ausführlich beschrieben.


Log in to reply