Ich möchte meine Klasse in eine DLL auslagern, aber wie mache ich das am besten?



  • Hi TObi,

    wenn man niemanden im Büro/Klasse hat von dem man das alles lernen kann
    und auch keine geeigneten Bücher / Tutorials findet, kann man es vergessen.

    Das ist meine Erkenntnis. Niemand kaut einem hier etwas vor, weil es
    immer den Beigeschmack hat, dass man nach vorgekauter Arbeit sich nicht
    mehr damit beschäftigt. Das stimmt sicher in einigen Fällen, aber ich habe
    das meiste aus dem Forum gelernt.

    Sobald ich morgen im Büro bin und die Zeit dazu finde (!) werde ich dir evtl.
    ein Beispiel und auch eine kleine Erklärung dazu posten.



  • So, dein Makro ist murks:

    #ifdef MYLIBRARY_EXPORT
    #define MYAPI __declspec(dllexport)
    #else // !MYLIBRARY_EXPORT
    #define MYAPI __declspec(dllimport)
    #endif // MYLIBRARY_EXPORT
    

    . Damit ist das schonmal korrekt 😉
    Jetzt noch in den Projekteinstellungen als Build-Define MYLIBRARY_EXPORT hinzufügen (im DLL-Projekt).

    class MYAPI foo {};
    

    sollte jetzt schonmal klappen!

    Die ganzen Warnungnen die dein Projekt ausgibt, liegen an unsauberen Code, der sich innerhalb deiner Klassen befindet!


  • Mod

    Nur als Anmerkung: Wenn Du Deine Klassen exportierst muss der Nutzer der DLL exakt die gleichen Compiler Einstellungen verwenden und den gleichen Compiler.

    Zudem musst Du zwingend die CRT und die MFC (falls benutzt) als shared DLL verwenden!



  • Ne die Dll soll nur für mich sein, ich will halt nur net staendig 8Datein meinem Projekt hinzufügen muessen um alle Funtionen zu verwenden.

    Und wegen dem unsauberen Code, was soll ich machen alle snoch mal schreiben bis er meint "Jo jetzt ist es mir sauber genug"?
    Haette sich der Compiler den nicht mal schon eher melden koennen?

    Gruß Tobi.


  • Mod

    Es liegt doch an Dir welche Warning Level Du einstellst!

    Wenn Du Dich entscheidest mit einem niedrigen Warning Level zu arbeuten um diese zu unterdrücken ist das Dein Bier. Bleibt aber immer noch schlechter Stil.



  • Aber ich habe doch nichts am warning level eingestellt? Wieso sagt er mir dann gerade erst jetzt bescheid, ist das level in ner DLL hoeher?


  • Mod

    Nein! Das ist er nicht.



  • dann liegts also nicht an meinem code?


  • Mod

    Aber sicher liegt es an Deinem Code. Die Warnungen komen doch nicht aus heiterem Himmel.



  • Warning 1 warning C4251: 'CGraph::m_szGraphName' : class 'std::basic_string<_Elem,_Traits,_Ax>' needs to have dll-interface to be used by clients of class 'CGraph'

    was ist damit gemeint?



  • Gib doch einfach den Errorcode in die MSDN ein. Die Errorcodes sind ja nicht aus Jux da.


  • Mod

    Du bewegst einfach den Cursor über die Fehlermeldung und drückst F1

    http://msdn2.microsoft.com/de-de/library/esew7y1w(VS.80).aspx

    Es ist genau die Warnung, die ich Dir auch schon gegeben habe:
    Wenn Du über DLL Grenzen Objekte tauscht, die eigentlich nur über inline Funktionen leben, dann gehst Du ein Kompatibiltätsrisiko ein.

    Deshalb bekommst Du diese Warnung auch erst, seitdme Du das als DLL kompilierst.



  • hmm und wenn ich das ganze einfachn ur als statische lib generieren will und auf die dll verzichte muesste es doch sdann gehen?



  • Ja.



  • Aber dann bleibt immernoch meine aller erste Frage offen:
    "Wie stelle ich es an das ich dann am Ende nur ein Header_File habe für die Library?"

    Oder Brauch so ein Lib-File keinen Header-File?

    Gruß Tobi.



  • Du bist doch daran "schuld" das es 4 Headers gibt. Die Library (egal ob .LIB, .DLL oder .so) ändert doch an den Headern nichts. Header sind für den Präprozessor da, Libraries für den Linker. Das sind zwei verschiedene Paar Schuhe die miteinander nichts zu tun haben.

    Am besten du liest nochmal nach was Präprozessor, Compiler und Linker ist. Dann wirst du feststellen, das jeder für sich alleine steht und eigentlich vom anderen nichts weiß.

    Wenn du nur eine Header haben willst, mußt du alle Header-Inhalte in eine Header kopieren oder eine Header machen, die alle anderen 4 Header inkludiert. (letzteres halte ich für besser!)

    Warum willst du überhaupt nur eine Header haben? Welchen Sinn soll das haben?



  • naja weil ich nicht ständig, wenn ich mit der lib abeite, 4Header inkludieren möchte?!



  • Hem, du inkludierst nur die Header, die du in deinem Source gerade brauchst. Machste doch bei fremden Libs ja auch so, oder?
    Wie gesagt, mach doch eine Header für alle:

    // MyLib.hpp
    #ifndef MYLIB_H
    #define MYLIB_H
    
    #include "header1.hpp"
    #include "header2.hpp"
    #include "header3.hpp"
    #include "header4.hpp"
    
    #endif
    
    // irgendwo.cpp
    #include "MyLib.hpp"
    

    Ist doch ganz einfach. 🙄



  • jo hab ich gemacht aber noch was. wenn ich die lib Datei demProjekt hinzufüge Fragt er mich:
    "Would you like to create a new rule file to define a costume build rule to build files with this extension?"

    Wozu sollte ich einen solchen file erstellen? Ist dieser nötig?

    EDIT:
    Ich habe die .lib meinem Projekt zugefügt und wollte die Klasse benutzen, aber er meint es ist eine undeklarierte Variable, obwohl ich wenn ich mit dem '::' arbeite die Variablen der Klasse finde in der Liste. Will ich sie so erstellen meint er sie gehört nicht zum Namensraum... hmmm

    Gruß Tobi.



  • *push*


Anmelden zum Antworten