Wie man statisch gegen die C-Runtime (CRT) linkt
In Foren ist einer der häufigsten Fragen:
“Ich kopiere meine (simple) C++ Anwendung auf einen anderen Rechner, aber dort geht diese nicht! Es kommt immer ein Fehler wie ‘Anwendungskonfiguration falsch’ oder ‘SxS Error’. Wie kann ich meine Anwendung dort laufen lassen?”
Das Problem liegt daran, dass per Default gegen die DLL-Version der CRT (C-Runtime) gelinkt wird. Für diie Lösung gibt es nun zwei Antworten:
1. Du musst das passende vcredist_x86.exe auf dem Zielrechner installieren oder mit Deinem Installer die Merge-Modules installieren
Diese Option ist aber meistens zu aufwendig für eine einfache Anwendung. Deshalb rate ich immer zu der zweiten (und aus meiner Sicht besten Lösung):
2. Du musst Deine Anwendung statisch gegen die CRT linken, dann werden die CRT-DLLs nicht benötig und somit gibt es auch nicht den obigen Fehler.
Und bis man das nun wieder jedem erklärt hat, wie man das umstellt habe ich jetzt einen kleinen Screen-Cast (2:12 min) gemacht, der dies schön zeigt:
http://www.kalmbach-software.de/screencasts/VC2008EE-StaticLinkCRT/
PS: Dies geht nicht wenn die EXE/DLL .NET verwendet…
April 28th, 2008 at 18:23
Dankeschön!
Nach stundenlanger Recherche endlich ein Programmierer der weiß wovon er redet und der konkrete Lösungsvorschläge nennen kann!
Respekt!
May 19th, 2008 at 10:38
Und innerhalb von 2:12 min war mein Problem gelöst.
Dankeschön!
September 18th, 2008 at 11:46
Vielen Dank, gute Arbeit.
Das ist doch ein Problem, welches eigentlich jeden betrifft, warum muss man immer erst stundenlang suchen bis jemand kurz und knapp Klartext redet.
September 18th, 2008 at 23:07
Die Anleitung ist gut,
allerdings verursacht die Exe jetzt ein Problem beim start und ‘muss beendet werden’. Es funktioniert nur wenn ich in ALLEN Konfigurationen Multithreaded-Debug-DLL verwende, keine der anderen Möglichkeiten funktioniert.
Der Debugger zeit auf folgende Funktion:
void __cdecl _CRT_DEBUGGER_HOOK(int _Reserved)
{
/* assign 0 to _debugger_hook_dummy so that the function is not folded in retail */
(_Reserved);
_debugger_hook_dummy = 0;
}
bzw auf den _debugger_hook_dummy .
Ich habe schon einige Zeit nach einer Lösung gesucht aber nichts gefunden, darum versuche ich jetzt hier mein Glück.
Nutze VS2005, MFC nutze ich nicht.
Es ist ein OpenGL Programm welches auch GLUT nutzt, könnte es sein dass die glut.dll mit diesem Problem zu tun hat?
Würde mich riesig freuen wenn mir jemand helfen kann.
October 19th, 2008 at 13:55
Vielen Dank, hat mein Problem auf Anhieb gelöst. Erst recht in den Foren werden sehr oft zu diesem Problem Themen erstellt.
Gute Arbeit!
November 30th, 2008 at 00:42
Hat mein Problem auch sofort gelöst.
Vielen Dank dafür.
January 17th, 2009 at 18:41
[…] was meinst du mit statisch linken? So gut kenne ich mich nicht aus mit den > Linkoptionen. > http://blog.kalmbach-software.de/de/…ime-crt-linkt/ — Martin Richter [MVP] WWJD http://blog.m-ri.de "A well-written program is its own heaven; a […]
January 30th, 2009 at 10:12
Hallo
Eine sehr schöne Erklärung und ich war mich rschon sicher, dass es funktioniert. Allerdings erhalte ich nun
Command line error D8016 : ‘/MT’ and ‘/clr’ command-line options are incompatible
Es handelt sich um eine Konsolenanwendung
Vielleicht gibt es auch hierzu noch eine Projekt einstellung:)?
Beste Grüsse, ansonsten eine top Beschreibung!!
Geri
January 30th, 2009 at 10:15
Hab ich das vergessen zu schreiben: .NET (/clr) und statisches Linken schliessen sich aus.
Hast Du mit *Absicht* eine .NET-Anwendung erstellt?
March 12th, 2009 at 21:59
Ich habe eine kleine Windows-Forms Anwendung mit VSC++ 2008 exp erstellt. Leider läuft sie nur auf dem Entwicklungspc. Die Anwendung besitzt die SerialPort Komponente. Welche Möglichkeiten habe ich, die Anwendung auf allen PC anwendbar zu machen? Bitte berücksichtigt in der Antwort das ich Einsteiger bin. Danke schon mal im Vorraus.
Tobi
March 12th, 2009 at 22:11
Hallo,
Du musst auf dem Zielsytem das .NET-Framework installieren und auch noch das vcredist_x86.exe
Siehe auch:
http://www.c-plusplus.de/forum/viewtopic-var-t-is-143003.html
March 17th, 2009 at 16:50
Vielen Dank für die tolle Anleitung! Hatte ja schon befürchtet, dass ich bei jedem User die “vcredist_x86.exe” installieren muss.
May 22nd, 2009 at 11:54
Sehr schön ich habe Stunden lang nach einer Lösung gesucht und hier ist sie (sehr gut erklärt)
October 14th, 2009 at 17:55
Danke, dies hat mein Problem gelöst (zumindest dieses eine..)
December 3rd, 2009 at 16:44
Schade jetzt bekomme ich die Fehler:
uafxcw.lib(afxmem.obj) : error LNK2005: “void * __cdecl operator new(unsigned int)” (??2@YAPAXI@Z) ist bereits in LIBCMT.lib(new.obj) definiert.
1>uafxcw.lib(afxmem.obj) : error LNK2005: “void __cdecl operator delete(void *)” (??3@YAXPAX@Z) ist bereits in LIBCMT.lib(delete.obj) definiert.
1>uafxcw.lib(afxmem.obj) : error LNK2005: “void * __cdecl operator new[](unsigned int)” (??_U@YAPAXI@Z) ist bereits in libcpmt.lib(newaop.obj) definiert.
1>uafxcw.lib(afxmem.obj) : error LNK2005: “void __cdecl operator delete[](void *)” (??_V@YAXPAX@Z) ist bereits in LIBCMT.lib(delete2.obj) definiert.
December 4th, 2009 at 10:22
Alle Deine Libs müssen natürlich auch diese Einstellung haben!
December 17th, 2009 at 21:08
[…] PS: Falls man kein CLI (CLR / .NET) verwendet hat, so ist es meistens einfacher, wenn man statisch gegen die CRT linkt! […]
December 20th, 2009 at 08:02
Lieber Jochen,
ich habe fast keine Ahnung von Programmierung, wollte mich nur etwas tiefer informieren, weil die Steuererklärung mit Elster nicht lief und traf dabei auf Deinen Blog. Hervorragend gemacht, grosses Kompliment an
Dich. Ich habe jetzt wenigstens eine vage Vorstellung von den Zusammenhängen.
Vielen Dank und frohe Festtage
Peter
January 29th, 2010 at 11:50
perfekt. mehr fällt ma dazu garned ein!!