Statisch zur CRT linken -> freeze
-
Hallo zusammen,
ich entwickle gerade eine Anwendung mit Visual Studio 2013, welche auch auf Rechnern laufen soll auf denen dieses nicht installiert ist. Ich will auch nicht dass die Anwender die Redist Packages installieren sollen, das Programm soll sich einfach so wie es ist ausführen lassen (ohne Installation).
Dazu hab ich jetzt in den Projekteinstellungen meiner Anwendung die Laufzeitbibliothek von Multithreaded-Dll zu Multithreaded umgestellt. Auf meinem Rechner (auf dem Visual Studio ja installiert ist) klappt alles bestens, auf einem anderen Rechner auf dem dieses nicht installiert ist, friert die Anwendung nach dem Starten einfach ein ("test.exe funktioniert nicht mehr").
Woran könnte das liegen? Ich verwende noch eine fremd-dll, von welcher ich nicht weiß ob sie statisch oder dynamisch zur CRT linkt, könnte es daran liegen? Wenn ja, wie sag ich dem Linker dass er diese dynamischen Links ignorieren soll?
Grüße,
hs
-
Wie die Fremd-DLL ihre Runtime linkt kannst du nicht umstellen, da dein Link-Vorgang diese DLL ja nicht ändern kann. Die ist ja schon fertig.
Probleme mit fehlender Runtime äussern sich aber i.A. nicht durch Einfrieren, sondern durch "Programm kann nicht starten" Fehler. Bei neueren Studio Versionen kommt dabei die wenig aussagekräftige Fehlermeldung dass mit der "Anwendungskonfiguration" irgendwas nicht passt. Bei älteren steht bei der Fehlermeldung schön die fehlende DLL dabei.
Da du kein solches Problem hast, wird es also nicht daran liegen.
Ansonsten kann ich beim Verdacht auf fehlende DLLs Dependency-Walker empfehlen. Ein Tool das mMn. jeder kennen sollte. Damit siehst du dann z.B. auch genau welche weiteren DLLs deine Fremd-DLL benötigt.
Folgendes könntest du probieren:
* Übersetz dein Programm komplett neu (Rebuild All)
* Ändern danach *nichts* mehr am Source-Code (nicht mal in Kommentaren)
* Kopier das so kompilierte Programm auf den anderen PC
* Starte es auf dem anderen PC
* Speicher ein Dump File (Geht bei aktuellen Windows Versionen z.B. über den Task-Manager ("Create dump file". Falls es diesem Kontext-Menu Punkt bei dir noch nicht gibt kannst du Process Explorer versuchen - ich glaube der kann das auch.)
* Öffne das Dump File in Visual Studio (gleicht wie du eine Solution öffnen würdest)
* Drücke auf "Play"Dann kannst du genau sehen in welchem Zustand sich das Programm befindet während es "hängt".
Bzw. was du vorher noch probieren könntest (viel einfacher, dafür auch weniger Chancen auf Erfolg): Kompiliere und starte auf deine PC eine Release Version. Und zwar nicht über Visual Studio starten, sondern ganz normal über den Explorer starten. Falls das Programm dann auch hängt, kannst du dich nachträglich mit Visual Studio draufängen (Debug -> Attach to Process).
Danach "Pause" drücken, dann siehst du auch genau in welchem Zustand dein Programm hängt.
-
Hallo,
danke für die Antwort. War mir sicher dass es ein Linker Problem ist, aber:
hustbaer schrieb:
Bzw. was du vorher noch probieren könntest (viel einfacher, dafür auch weniger Chancen auf Erfolg): Kompiliere und starte auf deine PC eine Release Version. Und zwar nicht über Visual Studio starten, sondern ganz normal über den Explorer starten. Falls das Programm dann auch hängt, kannst du dich nachträglich mit Visual Studio draufängen (Debug -> Attach to Process).
Danach "Pause" drücken, dann siehst du auch genau in welchem Zustand dein Programm hängt.hab das gemacht und die Fremd dll hatte einen Array-Out-Of-Bounds Fehler wegen ner fehlenden Sicherheitsabfrage
Hab das gefixed (die dll ist Gott sei Dank Open-Source) und jetzt funktionierts.
Vielen Dank auf jeden Fall für die ausführliche Antwort, hätte nie gedacht dass es an sowas banalem liegt.
hs
-
Cool
Warst du auch lieb und hast den Bug (+Fix) reported?
(Oder wurde der Fehler dadurch getriggert dass du falsche Werte übergeben hast, und die DLL halt einfach keinen Range-Check macht? Das würde ich vermutlich nicht als Fehler reporten. Höchstens nen Hinweis dass es nett wäre ein ASSERT einzubauen, damit der Fehler im Debug sofort gefunden wird.)
-
hustbaer schrieb:
Cool
Warst du auch lieb und hast den Bug (+Fix) reported?
Jetzt wo dus sagst... natürlich
Danke nochmal für die Hilfe