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…

29 thoughts on “Wie man statisch gegen die C-Runtime (CRT) linkt

  1. Peter Kleissner

    Dankeschön!

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

  2. Chrimax

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

  3. Oliver Schultz

    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

    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

    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

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

  7. Pingback: Dubuggen unter Vista | hilpers

  8. Geri

    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 Post author

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

  10. tobi

    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. Ralf

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

  12. ch4s0

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

  13. CG

    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.

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

  15. Peter

    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

  16. newcom

    HILFE ich benutze seit kurzem visual c++ 2008 kenne mich auch etwas in der c++ sprache aus und hab ein einfaches programm geschrieben zum test auf meinem pc gings aber auf einem anderen nicht da kam diese side by side ding hab jetzt alles gemacht wie in deinem film aber jetzt läufts nichtmal bei mir es tauchen in visual viele fehler auf und das programm öffnet sich nicht mehr bitte um hilfe

    die hauptsächlichen fehler sehen so aus vllt hilfts dir ja =
    Fehler 3 error C2871: ‘Reflection’: Es ist kein Namespace mit diesem Namen vorhanden
    Fehler 6 error C2653: ‘System’: Keine Klasse oder Namespace
    Fehler 13 error C2337: “AssemblyCompanyAttribute”: Attribut wurde nicht gefunden.

  17. newcom

    wie kann ich es dann machen das ich mit c/c++ schreibe statt mit C++/CLI
    denn ich würde sehr gern das man nichts weiter auf einem anderen rechner installieren muss

    lg new

  18. newcom

    vielen dank
    vorallem für die schnelle hilfe

    werde mir das glei mal ansehen hoffe es klappt

  19. newcom

    hab da noch eine frage ist es möglich eine 2 form in der ersten zu öffnen also ich mein z.b. das man bei der 1 form (mein hauptmenü) auf ein unterpunkt geht und sich dann die 2 form (ein bild) statt als neues fenster in dem 1 öffnet

    lg new

Comments are closed.