Share via


Binární kompatibilita jazyka C++ mezi verzemi sady Visual Studio

Sady nástrojů kompilátoru Microsoft C++ (MSVC) v sadě Visual Studio 2013 a starších verzích nezaručují binární kompatibilitu mezi hlavními verzemi. Nelze propojit soubory objektů, statické knihovny, dynamické knihovny a spustitelné soubory vytvořené různými verzemi těchto sad nástrojů. Rozhraní ABI, formáty objektů a knihovny modulu runtime nejsou kompatibilní.

Toto chování jsme změnili v sadě Visual Studio 2015 a novějších verzích. Knihovny modulu runtime a aplikace kompilované některou z těchto verzí kompilátoru jsou binární kompatibilní. Odráží se v hlavním čísle sady nástrojů C++, které začíná číslem 14 pro všechny verze od sady Visual Studio 2015. (Verze sady nástrojů je v140 pro Visual Studio 2015, v141 pro 2017, v142 pro 2019 a v143 pro 2022). Řekněme, že máte knihovny třetích stran vytvořené sadou Visual Studio 2015. Stále je můžete používat v aplikaci vytvořené sadou Visual Studio 2017, 2019 nebo 2022. Není nutné rekompilovat s odpovídající sadou nástrojů. Nejnovější verze distribuovatelného balíčku Microsoft Visual C++ (Redistributable) funguje pro všechny z nich.

Omezení binární kompatibility

Mezi aktualizacemi nástrojů v140, v141, v142 a v143 a dílčími číslovanými aktualizacemi verzí existují tři důležitá omezení binární kompatibility:

  • Binární soubory vytvořené s různými verzemi sad nástrojů v140, v141, v142 a v143 je možné kombinovat. Klíčové pravidlo je, že linker by měl pracovat pouze se vstupy vytvořenými sadou nástrojů, která je stejná verze (nebo starší) jako samotná. To platí pro aplikace, import knihoven, statické knihovny a další soubory, jak je popsáno ve vstupních souborech LINK. V některých případech lze knihovnu importu pro implicitně propojenou knihovnu DLL vytvořenou novější verzí sady nástrojů propojit pomocí starší verze sady nástrojů – zejména pokud knihovna importu výhradně používá extern "C" pro importy/exporty. Tady je několik příkladů, co to znamená:
    • Aplikace zkompilovaná se sadou nástrojů 2017 (verze 141 verze 15.0 až 15.9) je možné propojit se statickou knihovnou zkompilovanou pomocí sady nástrojů sady Visual Studio 2022 verze 17.8 (v143), ale propojení musí být provedeno pomocí sady nástrojů verze 17.8 nebo novější.
    • Aplikace a knihovny vytvořené pomocí sady nástrojů VS 2015, 2017, 2019 nebo 2022 se dají propojit společně, ale propojení se musí provést pomocí verze sady nástrojů, která je nejnovější nebo novější než, nejnovější sada nástrojů použitá k sestavení libovolného binárního souboru, který předáte linkeru. Například při použití tří binárních souborů vytvořených pomocí sad nástrojů ze sady nástrojů VS 2015 verze 14.3, VS 2017 verze 15.9 a VS 2019 verze 16.11 je můžete propojit pomocí libovolné verze sady nástrojů, která je 16.11 nebo novější.
    • Pokud je knihovna DLL sestavená s novější sadou nástrojů, může být knihovna importu někdy použita se staršími sadami nástrojů, pokud všechny exporty dodržují konvenci volání jazyka C (extern "C"). Jediný oficiálně podporovaný případ však využívá novější sadu Windows SDK se starší sadou nástrojů.
  • Redistribuovatelné použití aplikace má podobné omezení binární kompatibility. Při kombinování binárních souborů vytvořených různými podporovanými verzemi sady nástrojů musí být redistribuovaná verze minimálně stejně nová jako nejnovější sada nástrojů používaná jakoukoli komponentou aplikace.
  • Statické knihovny nebo soubory objektů kompilované pomocí přepínače kompilátoru /GL (optimalizace programu Kdo le) nebo propojené pomocí/LTCG(generování kódu v době propojení) nejsou binární kompatibilní napříč verzemi, včetně aktualizací podverzí. Všechny soubory objektů a knihovny kompilované pomocí /GL a /LTCG musí používat přesně stejnou sadu nástrojů pro kompilaci a poslední propojení. Například kód vytvořený v /GL sadě nástrojů Visual Studio 2019 verze 16.7 nelze propojit s kódem vytvořeným v /GL sadě nástrojů sady Visual Studio 2019 verze 16.8. Kompilátor generuje závažnou chybu C1047.

Upgrade distribuovatelné součásti Microsoft Visual C++ ze sady Visual Studio 2015 a novější

U sady Visual Studio 2015, 2017, 2019 a 2022 jsme zachovali číslo hlavní verze Microsoft Visual C++ Redistributable. To znamená, že najednou lze nainstalovat pouze jednu instanci Redistributable. Novější verze přepíše všechny starší verze, které už jsou nainstalované. Například jedna aplikace může nainstalovat Redistributable ze sady Visual Studio 2015. Pak další aplikace nainstaluje Redistributable ze sady Visual Studio 2022. Verze 2022 přepíše starší verzi, ale protože jsou binární, starší aplikace stále funguje správně. Ujistěte se, že nejnovější verze Redistributable obsahuje všechny nejnovější funkce, aktualizace zabezpečení a opravy chyb. Proto vždy doporučujeme upgradovat na nejnovější dostupnou verzi.

Podobně nemůžete nainstalovat starší redistributable, pokud je už nainstalovaná novější verze. Instalační program hlásí chybu, pokud se pokusíte. Podobná chyba se zobrazí, pokud nainstalujete redistribuci 2017 nebo 2019 na počítač, který už má verzi 2022:

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.

Tato chyba je navržená. Doporučujeme udržovat nejnovější verzi nainstalovanou. Ujistěte se, že se instalační program může obnovit z této chyby bezobslužně.

Důležité

Podpora knihovny modulu runtime pro systém Windows XP už není dostupná v nejnovějších Distribuovatelné součásti Visual C++ pro Visual Studio. Poslední redistributable pro podporu Systému Windows XP je verze 16.7 (soubor verze 14.27.29114.0). Pokud jsou vaše aplikace pro Windows XP nasazené nebo aktualizované na novější verzi redistributable, aplikace se nespustí. Další informace a informace o tom, jak získat verzi redistributable, která podporuje systém Windows XP, naleznete v tématu Konfigurace programů pro systém Windows XP.

Viz také

Historie změn v jazyce Visual C++
Nejnovější podporované soubory visual C++ Redistributable ke stažení