STL in DLL, gelinkt mit dynamischer RTL



  • Hallo Leute,

    mir ist aufgefallen, dass beim Beenden meiner Anwendung Zugriffsfehler auftreten, wenn ich in einer DLL den std::stringstream nutze und die DLL mit der dynamischen RTL gelinkt ist.

    Nach einigem Suchen bin ich jetzt auf dem Stand, dass diese Kombination nicht immer funktionieren muss.

    Die Lösung wäre demnach, das Häkchen "Mit dynamischer RTL linken" zu entfernen.

    2 Fragen dazu:

    - Gäbe es eine andere Lösung?
    - Habe ich die ganze Geschichte überhaupt richtig interpretiert?

    VG



  • Hallo,
    Das könnte was mit dem in folgenden Link beschriebenen Bug zu tun haben.
    http://qc.embarcadero.com/wc/qcmain.aspx?d=37491
    Verwendest du den Stream in einer statischen Methode oder ist er selbst statisch?
    Der Bug ist schon recht lange bekannt und war zumindest bis zur 2007er Version nicht behoben.



  • Ich habe ein Minimalbeispiel um den Fehler zu reproduzieren.

    Die Folgende Funktion wird von der DLL bereit gestellt:

    void __stdcall Test(void)
    {
       std::stringstream* ss = new std::stringstream();
       *ss << 1; //Ohne diesen Aufruf tritt der Fehler nicht auf
       delete ss;
    }
    

    Ich dachte zuerst auch, dass der Fehler vlt nicht aufrtitt, wenn ich das Objekt mit new erzeuge.

    Der Fehler tritt laut Aufruf-Stack in der CC32150MT.DLL auf. Ich verwende übrigens den C++ Builder XE6



  • Warum erzeugst du den Stream überhaupt dynamisch?



  • Hatte was ausprobiert, tut aber nichts zur Sache. Der Fehler tritt auch so auf:

    void __stdcall Test(void)
    {
       std::stringstream ss;
       ss << 1; //Ohne diesen Aufruf tritt der Fehler nicht auf
    }
    


  • Hallo zusammen,

    offensichlich gibt es von Embarcadero einen Wokraround für dieses Problem:

    If you dynamically load a DLL, you cannot link dynamically with the runtime library. Otherwise, an Access Violation occurs when the program terminates. There are two workarounds:

    One workaround is to not check "Dynamic RTL" on the Project>Options>C++ Linker page (this turns off dynamic linking for the RTL).

    The second workaround, which enables the use of dynamic linking for the RTL, is to define _DLL_UNLOAD_WORKAROUND in the "Conditional defines" field on Project>Options>Directories and Conditionals.

    http://edn.embarcadero.com/article/39758#RADStudio2010ReleaseNotes-VCL%2FRTLNotes

    In meinem Testprojekt (EXE lädt DLL mit LoadLibrary. EXE ruft Funktion von DLL auf. Funktion enthält ss<<1) habe ich die genannte Bedingung bei der DLL hinzugefügt. Der Fehler tritt jetzt nicht mehr auf...

    Gruß
    Kerem


Anmelden zum Antworten