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. Linke Deine Anwendung statisch gegen die CRT, 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…

19 Responses to “Wie man statisch gegen die C-Runtime (CRT) linkt”

  1. Peter Kleissner Says:

    Dankeschön!

    Nach stundenlanger Recherche endlich ein Programmierer der weiß wovon er redet und der konkrete Lösungsvorschläge nennen kann!
    Respekt!

  2. Chrimax Says:

    Und innerhalb von 2:12 min war mein Problem gelöst.
    Dankeschön!

  3. Oliver Schultz Says:

    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.

  4. CR Says:

    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.

  5. Sebastian Dürre Says:

    Vielen Dank, hat mein Problem auf Anhieb gelöst. Erst recht in den Foren werden sehr oft zu diesem Problem Themen erstellt.

    Gute Arbeit!

  6. Rene Schönfelder Says:

    Hat mein Problem auch sofort gelöst.
    Vielen Dank dafür.

  7. Dubuggen unter Vista | hilpers Says:

    […] 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 […]

  8. Geri Says:

    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

  9. jkalmbach Says:

    Hab ich das vergessen zu schreiben: .NET (/clr) und statisches Linken schliessen sich aus.
    Hast Du mit *Absicht* eine .NET-Anwendung erstellt?

  10. tobi Says:

    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

  11. jkalmbach Says:

    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

  12. Ralf Says:

    Vielen Dank für die tolle Anleitung! Hatte ja schon befürchtet, dass ich bei jedem User die “vcredist_x86.exe” installieren muss.

  13. ch4s0 Says:

    Sehr schön ich habe Stunden lang nach einer Lösung gesucht und hier ist sie (sehr gut erklärt)

  14. java Says:

    Danke, dies hat mein Problem gelöst (zumindest dieses eine..)

  15. CG Says:

    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.

  16. jkalmbach Says:

    Alle Deine Libs müssen natürlich auch diese Einstellung haben!

  17. Jochen Kalmbach’s Blog » Blog Archive » C++/CLI Programme auf einem anderen Rechner ausführen Says:

    […] PS: Falls man kein CLI (CLR / .NET) verwendet hat, so ist es meistens einfacher, wenn man statisch gegen die CRT linkt! […]

  18. Peter Says:

    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

  19. Fuz Says:

    perfekt. mehr fällt ma dazu garned ein!!

Leave a Reply