Zgodność binarna języka C++ między wersjami programu Visual Studio

Zestawy narzędzi kompilatora języka Microsoft C++ (MSVC) w programie Visual Studio 2013 i starszych wersjach nie gwarantują zgodności binarnej w głównych wersjach. Nie można łączyć plików obiektów, bibliotek statycznych, bibliotek dynamicznych i plików wykonywalnych utworzonych przez różne wersje tych zestawów narzędzi. Interfejsy API, formaty obiektów i biblioteki środowiska uruchomieniowego są niezgodne.

Zmieniliśmy to zachowanie w programie Visual Studio 2015 i nowszych wersjach. Biblioteki i aplikacje środowiska uruchomieniowego skompilowane przez dowolną z tych wersji kompilatora są zgodne z plikiem binarnym. Jest on odzwierciedlony w głównej liczbie zestawu narzędzi języka C++, która zaczyna się od 14 dla wszystkich wersji od programu Visual Studio 2015. (Wersja zestawu narzędzi to v140 dla programu Visual Studio 2015, wersja 141 dla wersji 2017, wersja 142 dla wersji 2019 i wersja 143 dla 2022 r.). Załóżmy, że masz biblioteki innych firm utworzone przez program Visual Studio 2015. Nadal można ich używać w aplikacji utworzonej przez program Visual Studio 2017, 2019 lub 2022. Nie ma potrzeby ponownego kompilowania przy użyciu pasującego zestawu narzędzi. Najnowsza wersja pakietu Microsoft pakiet redystrybucyjny programu Visual C++ (pakiet redystrybucyjny) działa dla wszystkich z nich.

Ograniczenia dotyczące zgodności binarnej

Istnieją trzy ważne ograniczenia dotyczące zgodności binarnej między wersjami 140, v141, v142 i v143 oraz aktualizacjami wersji pomocniczej numerowanej:

  • Pliki binarne utworzone z różnymi wersjami zestawów narzędzi w wersji 140, v141, v142 i v143 można łączyć. Reguła klucza polega na tym, że konsolidator powinien pracować tylko z danymi wejściowymi utworzonymi przez zestaw narzędzi, który jest tą samą wersją (lub starszą). Dotyczy to aplikacji, importowania bibliotek, bibliotek statycznych i innych plików zgodnie z opisem w temacie PLIKI wejściowe LINK. W niektórych przypadkach biblioteka importu niejawnie połączonej biblioteki DLL skompilowana przez nowszą wersję zestawu narzędzi może być połączona przy użyciu wcześniejszej wersji zestawu narzędzi — zwłaszcza jeśli biblioteka importu ściśle używa extern "C" do importów/eksportów. Oto kilka przykładów tego, co to wszystko oznacza:
    • Aplikacja skompilowana przy użyciu zestawu narzędzi 2017 (wersja 141 w wersji 15.0 do 15.9) może być połączona z biblioteką statyczną skompilowaną za pomocą programu Visual Studio 2022 w wersji 17.8 (wersja 143), ale łączenie musi odbywać się przy użyciu zestawu narzędzi w wersji 17.8 lub nowszej.
    • Aplikacje i biblioteki utworzone przy użyciu programu VS 2015, 2017, 2019 lub 2022 mogą być połączone razem, ale łączenie musi odbywać się przy użyciu wersji zestawu narzędzi, która jest tak najnowsza, jak lub nowsza niż najnowszy zestaw narzędzi używany do kompilowania dowolnych plików binarnych przekazywanych do konsolidatora. Na przykład w przypadku trzech plików binarnych utworzonych przy użyciu zestawów narzędzi programu VS 2015 w wersji 14.3, VS 2017 w wersji 15.9 i VS 2019 w wersji 16.11 można połączyć je przy użyciu dowolnej wersji zestawu narzędzi, która jest 16.11 lub nowsza.
    • Jeśli biblioteka DLL została skompilowana przy użyciu nowszego zestawu narzędzi, biblioteka importu może być czasami używana ze starszymi zestawami narzędzi, jeśli wszystkie eksporty są zgodne z konwencją wywoływania języka C (extern "C"). Jednak jedynym oficjalnie obsługiwanym przypadkiem jest użycie nowszego zestawu WINDOWS SDK ze starszym zestawem narzędzi.
  • Zestaw redystrybucyjny używany przez aplikację ma podobne ograniczenie zgodności binarnej. Po połączeniu plików binarnych utworzonych przez różne obsługiwane wersje zestawu narzędzi wersja pakietu redystrybucyjnego musi być co najmniej tak nowa, jak najnowszy zestaw narzędzi używany przez dowolny składnik aplikacji.
  • Biblioteki statyczne lub pliki obiektów skompilowane przy użyciu /GL przełącznika kompilatora (optymalizacja programu KtoTo le) lub połączonego przy użyciu (/LTCGgenerowanie kodu w czasie połączenia) nie są zgodne binarne w różnych wersjach, w tym aktualizacje wersji pomocniczej. Wszystkie pliki obiektów i biblioteki skompilowane przy użyciu polecenia /GL i /LTCG muszą używać dokładnie tego samego zestawu narzędzi dla kompilowania i końcowego linku. Na przykład kod utworzony przy użyciu zestawu /GL narzędzi programu Visual Studio 2019 w wersji 16.7 nie może być połączony z kodem utworzonym przy użyciu zestawu /GL narzędzi programu Visual Studio 2019 w wersji 16.8. Kompilator emituje błąd krytyczny C1047.

Uaktualnianie pakiet redystrybucyjny programu Visual C++ firmy Microsoft z programu Visual Studio 2015 lub nowszego

Zachowaliśmy numer wersji głównej programu Microsoft pakiet redystrybucyjny programu Visual C++ taki sam dla programu Visual Studio 2015, 2017, 2019 i 2022. Oznacza to, że jednocześnie można zainstalować tylko jedno wystąpienie pakietu Redystrybucyjnego. Nowsza wersja zastępuje starszą wersję, która jest już zainstalowana. Na przykład jedna aplikacja może zainstalować pakiet redystrybucyjny z programu Visual Studio 2015. Następnie inna aplikacja instaluje pakiet redystrybucyjny z programu Visual Studio 2022. Wersja 2022 zastępuje starszą wersję, ale ponieważ są one zgodne z plikiem binarnym, wcześniejsza aplikacja nadal działa prawidłowo. Upewniamy się, że najnowsza wersja pakietu redystrybucyjnego zawiera wszystkie najnowsze funkcje, aktualizacje zabezpieczeń i poprawki błędów. Dlatego zawsze zalecamy uaktualnienie do najnowszej dostępnej wersji.

Podobnie nie można zainstalować starszego pakietu redystrybucyjnego, gdy nowsza wersja jest już zainstalowana. Instalator zgłasza błąd w przypadku próby. W przypadku zainstalowania pakietu redystrybucyjnego 2017 lub 2019 na maszynie, na której zainstalowano już pakiet redystrybucyjny 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.

Ten błąd jest zgodnie z projektem. Zalecamy, aby najnowsza wersja została zainstalowana. Upewnij się, że instalator może odzyskać dane po tym błędzie w trybie dyskretnym.

Ważne

Obsługa bibliotek środowiska uruchomieniowego dla systemu Windows XP nie jest już dostępna w najnowszej Pakiet redystrybucyjny Visual C++ dla Visual Studio. Ostatnią redystrybucją do obsługi systemu Windows XP jest wersja 16.7 (plik w wersji 14.27.29114.0). Jeśli aplikacje systemu Windows XP są wdrażane przy użyciu lub aktualizowane w nowszej wersji pakietu redystrybucyjnego, aplikacje nie będą uruchamiane. Aby uzyskać więcej informacji i jak uzyskać wersję pakietu redystrybucyjnego obsługującego system Windows XP, zobacz Konfigurowanie programów dla systemu Windows XP.

Zobacz też

Historia zmian języka Visual C++
Najnowsze obsługiwane pliki do pobrania pakiet redystrybucyjny programu Visual C++