Warum brauche ich eine Visual C/C++ Runtime im Windows?



  • Hallo Ihr,

    wie der Titel sich schon liest, werden viele denke "Was für ne dumme Frage" 🙂

    Ich habe die Anforderung , eine (native) Applikation zu entwickeln welche keine Runtime (.NET oder Java etc.) benötige, und auf WinXP 32 bit aufwärts laufen soll. Und ich quasi nur die "exe" ausführen kann ohne zusätzliche Installationen.

    Dann habe ich eine Test App, in VS2015 (QT) unter C++ mit WinXP Toolkit entwickelt.

    Nun muss ich aber die Visual C/C++ Runtime installieren 🤔 Aber ich frage mich , wofür ich Native Apps in VSXXXX entwickeln kann, welche dann trotzdem eine "Runtime" brauchen und installieren muss!?



  • Die Visual C++ Redistributable für Visual Studio 2015 beinhaltet wichtige Funktionen, welche im C und C++ Standard definiert sind, s.a. C++-Sprache und Standardbibliotheken.

    Du kannst diese jedoch auch statisch linken: How to Static Link VC Runtime in Visual C++?
    (auch wenn das nicht empfohlen wird, da Sicherheitsupdates dann nicht automatisch eingepflegt werden, sondern du selber dann als Entwickler dafür verantwortlich bist).

    Und wenn du QT benutzt, dann wirst du diese auch statisch linken müssen (oder die DLLs mit ausliefern) - beachte aber die Lizenzbedingungen! Außerdem unterstützen die neuesten QT-Versionen auch kein WinXP mehr!



  • Es gibt immer eine Runtime oder wo sind sonst die ganzen C++ Standardfunktionen definiert die dein Programm verwendet (z.b. die Implementierung von std::cout) 🙂
    Die Visual Studio C++ Runtime enthält unter anderen die libraries für teile der STL, welche keine Templates sind.
    Bei jeder Visualstudio Version gibt eine neue Version der Runtime, da sich auch die C++ Sprache weiterentwickelt.

    Da VS2015 jünger ist als WinXP gibt es dort die VS2015 C++ Runtime nicht vorinstalliert.
    AFAIK ab Win7 ist die VS2015 C++ Runtime vorinstalliert.

    Man kann die C++ Runtime auch statisch linken. Nur das wird dir wohl nicht viel helfen, wenn du Qt nicht auch statisch dazu linkst, denn die Qt libraries selbst referenzieren DLLs aus der C++ Runtime.



  • Guten Morgen,

    danke für Euere antworten 🙂 Aber dann zu nächsten Frage:
    Wie sieht es dann mit vorhanden Programmen in Windows aus (bspw. Explorer.exe) dies kommt dann ohne die Runtime aus? Verwenden diese Programmen keine STL etc.

    P.S. Ja das mit statisch linken wird dann wohl leider nichts...

    Grüße



  • Der Großteil von Windows ist in C geschrieben (insb. die Schnittstelle: WinAPI) bzw. sogar direkt in Assembler.
    (Fast) jedes Windows-Programm referenziert aber die System-DLLs aus dem Windows/System32-Verzeichnis (Kernel32.dll, Gdi32.dll, User32.dll, ...), s.a. Microsoft Windows library files, also auch "Explorer.exe", "Notepad.exe", ...

    PS: Besonders lesenswert für dich ist der Abschnitt "Runtime libraries" im obigen Link (da Version 14.0 Visual Studio 2015 entspricht, s.a. Microsoft Visual C++: Internal version numbering).

    Wenn du mehr über die referenzierten DLLs erfahren möchtest, dann lade dir den Dependency Walker herunter und öffne damit dann z.B. die "Explorer.exe" (diese referenziert mehr als 20 DLLs, u.a. auch die "MSVCRT.dll", also die [ursprüngliche] Microsoft Visual C-Runtime Library - jede neuere VS-Version liefert jedoch eine eigene C-Runtime Library mit: Windows is not a Microsoft Visual C/C++ Run-Time delivery channel).



  • @Th69 sagte in Warum brauche ich eine Visual C/C++ Runtime im Windows?:

    MSVCRT.dll

    Ahh super erklärt.:) Dh. auch WinXP 32 hat eine "MSVCRT.dll" aber die ist dann zu meiner Qt Anwendung welche in VS2015 geschrieben ist nicht mehr kompatibel.

    D.h. würde ich komplett auf alle "nachträglichen" Installation verzichten, müsste ich meine App nut mit WinAPI umsetzen oder?:)



  • Ja, exakt (oder aber wie schon geschrieben statisch linken). Du mußt aber auch beachten, daß mit jeder Windows-Version neuere (bzw. geänderte) Funktionen in den System-DLLs implementiert sind, d.h. insb. bei Kompatibilität zu Win XP mußt du in der MSDN nachschauen, ab welcher Windows-Version diese zur Verfügung stehen (zu Zeiten von Win95, Win98, Win 2000 und WinXP gab es ebenfalls schon diese Problematik).

    PS: Ansonsten kommt "Einsprungspunkt nicht gefunden" ("entry point not found").



  • Perfekt , das hilft mir schon sehr weiter:) Vielen Dank:)

    P.S. Meine Test App läuft unter WinXP 32 und Win10 64.. schonmal gut^^ Aber eben mit auf XP mot der C++ Redistributable 2015! 😞

    P.P.S.: Statisch linken ginge aber nur "komplett", wenn ich ne Commercial Lizenz von Qt hätte..gell!?



  • @SoIntMan sagte in Warum brauche ich eine Visual C/C++ Runtime im Windows?:

    @Th69 sagte in Warum brauche ich eine Visual C/C++ Runtime im Windows?:

    MSVCRT.dll

    Ahh super erklärt.:) Dh. auch WinXP 32 hat eine "MSVCRT.dll" aber die ist dann zu meiner Qt Anwendung welche in VS2015 geschrieben ist nicht mehr kompatibel.

    D.h. würde ich komplett auf alle "nachträglichen" Installation verzichten, müsste ich meine App nut mit WinAPI umsetzen oder?:)

    Die MSVCRT gehört mittlerweile zum Betriebssystem und kann eigentlich nicht mehr fest einer Compiler Version zugeordnet werden. Ursprünglich kam diese CRT mit VC6.
    Intern hat MS diese Version weiterentwickelt (oder besser Bugs beseitigt) und aufgrund der großen Abhängigkeiten im eigenen OS so belassen.

    Und Nein! Auch wenn Dur nur die Windows API benutzt ist eine Runtime nötig. sobald Du irgendwelche C/C++ Bibliotheksfunktionen benutzt.

    Statisches Linken ist die einzige Möglichkeit eine EXE Datei nur noch abhängig vom OS zu machen...



  • @Martin-Richter sagte in Warum brauche ich eine Visual C/C++ Runtime im Windows?:

    Die MSVCRT gehört mittlerweile zum Betriebssystem und kann eigentlich nicht mehr fest einer Compiler Version zugeordnet werden. Ursprünglich kam diese CRT mit VC6.

    Aber auch nur höchstens seit Win10 vorher wird immer eine passende VC++ Runtime installation benötigt je nachdem welche Visual Studio C++ Version verwendet wird.
    Und da der OP auch WinXP unterstützen muss kommt er nicht um die installation der runtime rum.
    Eine andere möglichkeit wäre die entsprechenden MSVCRT.dll mit dem Programm beizulegen. Wobei ich nicht weis wie einfach das funktioniert alle relevanten DLLs mitzuliefern.
    Denn es könnte sein, dass für WinXP eine andere Version der MSVCRT.dll (für VS2015) benötigt wird als für Win7 und neuer.
    Da sich seit WinXP eventuell auch die internas von Windows verändert haben, welche eine angepasste version der CRT benötigt.

    @SoIntMan Was spricht wirklich dagegen neben der exe auch den installer der vs2015 c++ runtime (vcredist) mitzuliefern.
    Notfalls muss auf dem Zielsystem dann einmalig der installer ausgeführt werden.



  • Bekam mit MSVC auch schon ein Durcheinander und Fehlermeldungen oder Warnmeldungen mit den Compiler-Optionen /MT /MTd /MD /MDd. Also dadurch, dass eingebundene libraries mit (den vorher erwähnten) unterschiedlichen Compiler-Optionen kompiliert wurden.

    Zudem bin ich mir unsicher, ob man die C++-Laufzeitbibliothek statisch linken (also /MT oder /MTd) und dann aber die library dynamisch kompilieren und linken kann (Also es ergeben sich ja dann drei weitere Varianten). Also bei libraries (Programmbibliotheken) linke ich statisch, weil sonst die dll's fehlen oder noch kopiert werden müssen.

    Fand zwar dazu einmal von der WinAPI (oder SDK?) SetDllDirectory und Dynamic-Link Library Search Order und Search Path Used by Windows to Locate a DLL.



  • Deine SetDLLDirectories und DLL search path haben damit gar nichts zu tun.

    Grundsätzlich:
    Wenn Du Code zusammenstellst mit dem Linker und Du bindest andere Libraries ein, dann sollten die (sofern Sie kein reines POD Interface besitzen) immer mit den gleichen Einstellungen kompiliert werden wie die EXE.

    Ansonsten gibt es üble Effekte was freigeben von Speicher etc. betrifft.

    Also jede OBJ Datei, die Du einbindest muss mit den gleichen CRT Einstellungen kompiliert werden. Das gilt auch für Debug / Non-Debug Einstellungen...

    Aber wenn Dein Projekt aus mehreren DLLs besteht, würde ich nicht statisch linken! Dann hast Du sowieso einen Installer.
    Also was interessiert Dich ob eine CRT noch mit installiert werden muss?

    Was ist eigentlich Dein Problem?


Anmelden zum Antworten