Binärkompatibilität von C++ zwischen Visual Studio-Versionen
Die Compilertoolsets von Microsoft C++ (MSVC) in Visual Studio 2013 und früheren Versionen garantieren keine Binärkompatibilität zwischen Hauptversionen. Sie können keine Objektdateien, statischen Bibliotheken, dynamischen Bibliotheken und ausführbaren Dateien verknüpfen, die von verschiedenen Versionen dieser Toolsets erstellt wurden. Die ABIs, Objektformate und Laufzeitbibliotheken sind inkompatibel.
Wir haben dieses Verhalten in Visual Studio 2015 und höheren Versionen geändert. Die Laufzeitbibliotheken und Apps, die von einer dieser Versionen des Compilers kompiliert werden, sind binärkompatibel. Dies spiegelt sich in der Hauptversionsnummer des C++-Toolsets wider, die für alle Versionen seit Visual Studio 2015 mit 14 beginnt. (Die Toolsetversion ist v140 für Visual Studio 2015, v141 für 2017, v142 für 2019 und v143 für 2022). Angenommen, Sie haben Bibliotheken von Drittanbietern, die von Visual Studio 2015 erstellt wurden. Sie können sie weiterhin in einer Anwendung verwenden, die von Visual Studio 2017, 2019 oder 2022 erstellt wurde. Das erneute Kompilieren mit einem passenden Toolset ist nicht erforderlich. Die neueste Version des Microsoft Visual C++ Redistributable-Pakets (Redistributable) funktioniert für alle.
Einschränkungen bei der Binärkompatibilität
Es gibt drei wichtige Einschränkungen für die Binärkompatibilität zwischen den Toolsets v140, v141, v142 und v143 und den nummerierten Nebenversionsupdates:
- Binärdateien, die mit verschiedenen Versionen der Toolsets v140, v141, v142 und v143 erstellt wurden, können kombiniert werden. Die wichtigste Regel ist, dass der Linker nur mit Eingaben arbeiten sollte, die von einem Toolset erstellt wurden, das dieselbe Version (oder älter) wie der Linker hat. Dies gilt für Apps, Importbibliotheken, statische Bibliotheken und andere Dateien, wie in LINK-Eingabedateien beschrieben. In einigen Fällen kann eine Importbibliothek für eine implizit verknüpfte DLL, die von einer späteren Version des Toolsets erstellt wurde, mithilfe einer früheren Version des Toolset verknüpft werden, insbesondere, wenn die Importbibliothek streng
extern "C"
für Importe/Exporte verwendet. Die folgenden Beispiele zeigen Ihnen, was dies bedeutet:- Eine App, die mit einem Toolset von 2017 (v141, Version 15.0 bis 15.9) kompiliert wurde, kann mit einer statischen Bibliothek verknüpft werden, die mit Visual Studio 2022, Version 17.8 (v143), kompiliert wurde, aber die Verknüpfung muss mit einem Toolset der Version 17.8 oder höher erfolgen.
- Apps und Bibliotheken, die mit VS 2015, 2017, 2019 oder 2022 erstellt wurden, können miteinander verknüpft werden, aber die Verknüpfung muss mit einer Version des Toolsets erfolgen, die mindestens so aktuell ist wie das neueste Toolset zum Erstellen einer der Binärdateien, die Sie an den Linker übergeben. Wenn Sie z. B. drei Binärdateien haben, die mit Toolsets aus VS 2015, Version 14.3, VS 2017, Version 15.9, und VS 2019, Version 16.11, erstellt wurden, können Sie sie mit jeder Toolsetversion verknüpfen, die 16.11 oder höher ist.
- Wenn eine DLL mit einem neueren Toolset erstellt wird, kann die Importbibliothek manchmal mit älteren Toolsets verwendet werden, wenn alle Exporte der C-Sprachaufrufkonvention folgen (
extern "C"
). Der einzige offiziell unterstützte Anwendungsfall ist allerdings die Verwendung eines neueren Windows-SDK mit einem älteren Toolset.
- Das Redistributable, das Ihre App verwendet, weist eine ähnliche Binärkompatibilitätseinschränkung auf. Wenn Sie Binärdateien kombinieren, die von verschiedenen unterstützten Versionen des Toolsets erstellt wurden, muss die Redistributable-Version mindestens so neu sein wie das neueste Toolset, das von einer App-Komponente verwendet wird.
- Statische Bibliotheken oder Objektdateien, die mithilfe der Compileroption
/GL
(Optimierung des gesamten Programms) kompiliert oder mit/LTCG
(Link-Zeitcodegenerierung) verknüpft werden, sind nicht versionsübergreifend binärkompatibel, einschließlich Nebenversionsupdates. Alle Objektdateien und Bibliotheken, die mit/GL
und/LTCG
kompiliert wurden, müssen genau dasselbe Toolset für die Kompilierung und die endgültige Verknüpfung verwenden. Code, der mithilfe von/GL
im Visual Studio 2019 Version 16.7-Toolset erstellt wurde, kann z. B. nicht mit Code verknüpft werden, der mithilfe von/GL
im Visual Studio 2019 Version 16.8-Toolset erstellt wurde. Der Compiler gibt Schwerwiegender Fehler C1047 aus.
Aktualisieren des Microsoft Visual C++ Redistributable von Visual Studio 2015 und höher
Wir haben die Hauptversionsnummer des Microsoft Visual C++ Redistributable für Visual Studio 2015, 2017, 2019 und 2022 beibehalten. Das bedeutet, dass jeweils nur eine Instanz des Redistributables installiert werden kann. Eine neuere Version überschreibt alle älteren Versionen, die bereits installiert sind. Beispielsweise kann eine App das Redistributable aus Visual Studio 2015 installieren. Anschließend installiert eine andere App das Redistributable aus Visual Studio 2022. Die Version 2022 überschreibt die ältere Version, aber da sie binärkompatibel sind, funktioniert die frühere App weiterhin einwandfrei. Wir stellen sicher, dass die aktuelle Version des Redistributables alle neuesten Features, Sicherheitsupdates und Fehlerbehebungen enthält. Deshalb empfehlen wir immer ein Upgrade auf die neueste verfügbare Version.
Ebenso können Sie ein älteres Redistributable nicht installieren, wenn bereits eine neuere Version installiert ist. Wenn Sie dies versuchen, meldet das Installationsprogramm einen Fehler. Wenn Sie das Redistributable 2017 oder 2019 auf einem Computer installieren, auf dem bereits die Version 2022 installiert ist, wird ein Fehler wie der folgende angezeigt:
0x80070666 - Another version of this product is already installed. Installation of this version cannot continue. To configure or remove the existing version of this product, use Add/Remove Programs on the Control Panel.
Dieser Fehler ist beabsichtigt. Es wird empfohlen, die neueste Version installiert zu lassen. Stellen Sie sicher, dass das Installationsprogramm die Wiederherstellung nach diesem Fehler im Hintergrund ausführen kann.
Wichtig
Die Laufzeitbibliothek für Windows XP wird im aktuellen Visual C++ Redistributable für Visual Studio nicht mehr unterstützt. Das letzte Redistributable, das Windows XP unterstützt, ist Version 16.7 (Dateiversion 14.27.29114.0). Wenn Ihre Windows XP-Apps mit einer späteren Version des Redistributable bereitgestellt oder auf eine solche aktualisiert werden, werden die Apps nicht ausgeführt. Weitere Informationen und Informationen zum Abrufen einer Version des Redistributables, die Windows XP unterstützt, finden Sie unter Konfigurieren von Programmen für Windows XP.
Weitere Informationen
Änderungsverlauf von Visual C++
Neueste unterstützte Visual C++ Redistributable-Downloads