Statisches Linken der C/C++ Runtime Library
-
Nabend,
Ich habe ein Projekt welches aus einer .exe und eigenen DLLs besteht. Da ich vermeiden möchte, dass Fremdnutzer auf anderen PCs das redistributable package erst selbst installieren müssen, wollte ich die crl statisch linken.
Also habe ich mein Projekt (Release) Version in den Eigentschaften auf /MT gesetzt. Nach dem Kompilieren ist die .exe auch größer als sonst. (Debug Version ist auf /MTd gesetzt).
Teste ich mein Programm aber auf einem anderen PC, wird dennoch die msvcp110.dll verlangt. Wo liegt der Fehler? Ich dachte das könne so verhindert werden?
PadMad
-
PadMad schrieb:
und eigenen DLLs besteht.
Die müssten die CRT dann natürlich auch statisch linken.
Ist aber eher nicht zu empfehlen, liefere neben der exe und deinen dlls doch einfach auch die CRT dlls mit, somit muss die vcredist.exe nicht ausgeführt werden (die CRT dlls können sich also einfach im exe-Verzeichnis befinden).
-
Danke für die Antwort.
Das reinpacken von den DLLs msvcp110.dll und msvcr110.dll in meinem Programmverzeichnis habe ich zuerst probiert gehabt. Da hatte er mir folgenden Fehler ausgespuckt (Projekt wieder auf /MD gesetzt):
"Die Anwendung konnte nicht gestartet werden (0xc0000007b).."
Oder fehlen da noch DLLs?
-
Äh, machst du einen 32 oder 64bit build?
Auf welchem OS startest du das Programm?
Wenn XP: Hast du im VS2012 auch das XP toolset ausgewählt? Standardmäßig sind die exen nämlich nicht mehr XP kompatibel.
-
- Windows 7
- Visual Studio 2012 Express
- Ich vermute 32 Bit, weil beim nutzen der vcredist_x86.exe (der herkömmliche Weg) funktioniert mein Programm ja auch.Also ich entwickel sowohl unter Windows 7, als teste ich es auch unter Windows 7.
-
Du hast wahrscheinlich die 64bit CRT DLLs erwischt.
-
Tatsächlich ist es doch anders rum.
Mein Programm scheint doch 64 Bit basiert zu sein. (Wieso funktioniert es dann mit der vcredist_x86.exe? und die Projektoption "Win32-Projekt anlegen" ist ein wenig verwirrend :p )Ich habe einfach mal aus den Ordnern (findet man auf jedem entsprechenden Windowssystem) "Windows/System32" und "Windows/SysWOW64" die beiden DLL datein "msvcp110.dll" und "msvcr110.dll" gezogen und es getestet. Die 32 Bit DLLs haben wieder den selben Fehler gebracht. Bei den 64 DLLs hat es funktioniert.
Am Ende brauchte ich ohnehin nur die "msvcr110.dll" Datei.
Danke für den Tipp.
-
Unter Windows 7 64bit befinden sich die 32bit CRT DLLs im SysWOW64 Ordner und die 64bit CRT DLLs im System32 Ordner
Ob eine PE Datei 32 oder 64bittig ist, kannst du einfach mit CFF Explorer (http://www.ntcore.com/exsuite.php) checken.
Bin mir sicher, deine exe ist 32bit und du hast auch die 32bit CRT DLL
-
Verhext!
Tatsächlich eine PE 32.
Nettes Tool.Auch nettes Zusatzwissen um die beiden obengenannten Ordner ^^ Darauf muss man erstmal kommen... oder es wissen :p