class 'std::map<_Kty,_Ty>' erfordert eine DLL-Schnittstelle



  • Ich habe hier eine Linkerwarnung :

    warning C4251: 'VDialog::m_DialogList': class 'std::map<_Kty,_Ty>' erfordert eine DLL-Schnittstelle, die von Clients von class 'vtools::VDialog' verwendet wird
    with
    [
    _Kty=HWND,
    _Ty=vtools::VDialog *
    ]

    Header:
    #include <map>
    
    using namespace std;
    
    #define _EXPORT_DLL_ __declspec(dllexport)
    class VDialog;
    ...
    typedef map<HWND,VDialog*> DIALOGLIST;
    
    class _EXPORT_DLL_ VDialog
    {
    protected:
        /*contains a list of VDialog (this pointer) accessed by the window handle
        (these handles are unique, so several windows can be used with by only one VDlgHandler!)
        */
        static DIALOGLIST m_DialogList;	    << WARNING !...
    public:
    ...
    };
    
    CPP:
    DIALOGLIST VDialog::m_DialogList;
    

    (static muss sein!)

    wie kann ich das umschiffen??

    thx



  • Indem du das Semikolon an die richtige Stelle, nämlich ans Ende der Zeile setzt? Ich frag mich auch, was du mit einem Array von maps willst...



  • hehe,
    nein dass [ i ] war eigentlich für das invertieren zuständig, nur hat der c++ code tag es nicht richtig umgesetzt.



  • invertieren? was soll denn hier umgekehrt werden? Du meinst itallic == kursiv



  • Bei

    typedef map<HWND,VDialog*> DIALOGLIST;
    

    vergisst du den namespace. Mach

    typedef std::map<HWND,VDialog*> DIALOGLIST;
    

    draus.



  • using namespace std;
    hab ich vergessen reinzusetzen!
    aber das war auch vorher drin, und es funkz net



  • Hi,

    glaube du musst noch die Headerfile von 'VDialog' einbinden.

    Achso und den kompletten Namespace in ner Headerfile zu oeffnen, ist glaube ich
    nicht sehr gut.

    mfg
    v R



  • Das hat nichts mit C++ zu tun, sondern mit DLLs.



  • leute :
    es ist doch nur ein auszug!!
    der source ist komplett ohne fehler compilierbar.
    aber es treten diese Warnmeldungen auf.

    das hat tatsächlich etwas mit DLLs zu tun,
    aber es tritt nur im zusammenhang mit Static und dem STL-Element map auf.

    ich glaube, es hat was damit zu tun. das die klasse map nicht exportiert wird, und so von aussen nicht auf die eigenschaft zugreifbar ist - deshalb kein fehler, sondern eine warnung.

    aber wie stelle ich dieses manko ohne pragma warning ab?



  • Ach sorum.

    template __declspec(dllexport) std::map<HWND, VDialog*>;
    

    Wenn du die DLL nachher benutzen willst, muss da stattdessen

    extern template __declspec(dllimport) std::map<HWND, VDialog*>;
    

    stehen. Am besten unterscheidest du das durch ein Makro, COMPILING_DLL oder so, dass du definierst, wenn du die DLL kompilierst, und nicht definierst, wenn du eine Anwendung, die die DLL benutzt, kompilierst. Der Microsoft Knowledge Base-Artikel 168958 dürfte dir weiterhelfen.



  • also ich hab nun folgendes gemacht

    #ifdef EXP_STL
    template __declspec(dllexport) std::map<HWND, VDialog*>;
    #else
    extern template __declspec(dllimport) std::map<HWND, VDialog*>;
    #endif
    

    EXP_STL wird nur in der DLL gesetzt.
    im Projekt selber ist die Definition aufgehoben.

    Aber mit VC++ .NET kommt diesselbe warnung - dazu im else zweig

    warning C4231: Nicht dem Standard entsprechende Erweiterung: 'extern' vor der expliziten Vorlagen-Instanziierung


Anmelden zum Antworten