Visual Studio のバージョン間の C++ バイナリ互換性

Visual Studio 2013 以前の Microsoft C++ (MSVC) コンパイラ ツールセットでは、メジャー バージョン間のバイナリ互換性は保証されません。 バージョンが異なるこれらのツールセットによってビルドされたオブジェクト ファイル、スタティック ライブラリ、ダイナミック ライブラリ、実行可能ファイルをリンクすることはできません。 ABI、オブジェクト形式、ランタイム ライブラリには互換性がありません。

この動作は、Visual Studio 2015 以降のバージョンで変更されました。 これらのバージョンのコンパイラのいずれかでコンパイルされたランタイム ライブラリとアプリは、バイナリ互換性があります。 これは、Visual Studio 2015 以降の 14 で始まるすべてのバージョンの、C++ ツールセット メジャー番号に反映されます (ツールセットのバージョンは、Visual Studio 2015 の場合は v140、2017 の場合は v141、2019 の場合は v142、2022 の場合は v143 です)。 たとえば、Visual Studio 2015 によってビルドされたサード パーティ ライブラリがあるとします。 これらは、Visual Studio 2017、2019、または 2022 でビルドされたアプリケーション内で引き続き使用できます。 一致するツールセットで再コンパイルする必要はありません。 Microsoft Visual C++ 再頒布可能パッケージ (再頒布可能パッケージ) の最新バージョンは、すべてのバージョンで動作します。

バイナリ互換性に関する制限事項

v140、v141、v142、v143 のツールセットとマイナー番号のバージョン更新の間のバイナリ互換性には、重要な制限が 3 つあります。

  • 異なるバージョンの v140、v141、v142、v143 ツールセットで作成されたバイナリを組み合わせることができます。 重要な規則は、リンカーは、それ自体と同じバージョン (またはそれ以前) のツールセットによって構築された入力のみを処理する必要があるということです。 これは、LINK 入力ファイルの説明に従って、アプリ、インポート ライブラリ、静的ライブラリ、およびその他のファイル適用されます。 場合によっては、新しいバージョンのツールセットによって構築された暗黙的にリンクされた DLL のインポート ライブラリは、以前のバージョンのツールセットを使用してリンクできます。特に、インポート ライブラリがインポート/エクスポートに厳密に使用extern "C"する場合です。 これが何を意味するかの例をいくつか次に示します。
    • 2017 ツールセット (v141 バージョン 15.0 から 15.9) でコンパイルされたアプリは、Visual Studio 2022 バージョン 17.8 (v143) でコンパイルされたスタティック ライブラリにリンクできますが、リンクはバージョン 17.8 以降のツールセットを使用して行う必要があります。
    • VS 2015、2017、2019、または 2022 を使用してビルドされたアプリとライブラリはリンクできますが、リンクは、リンカーに渡すバイナリのビルドに使用される最新のツールセットと同じか、それより新しいバージョンのツールセットを使用して行う必要があります。 たとえば、VS 2015 バージョン 14.3、VS 2017 バージョン 15.9、VS 2019 バージョン 16.11 のツールセットを使用してビルドされた 3 つのバイナリを使用すると、16.11 以降の任意のツールセット バージョンを使用してリンクできます。
    • 新しいツールセットを使用して DLL をビルドした場合、すべてのエクスポートが C 言語呼び出し規則 (extern "C") に従っていれば、インポート ライブラリを古いツールセットで使用できる場合があります。 ただし、公式にサポートされている唯一のケースは、古いツールセットで新しい Windows SDK を使用することです。
  • ご自身のアプリによって使用される再頒布可能パッケージにも、同様のバイナリ互換性の制限があります。 サポートされているさまざまなバージョンのツールセットでビルドされたバイナリを混在させる場合、再頒布可能パッケージのバージョンは、任意のアプリ コンポーネントで使用されている最新のツールセットと同じか、それ以上である必要があります。
  • /GL (プログラム全体の最適化) コンパイラ スイッチを使用してコンパイルされた、または /LTCG (リンク時のコード生成) を使用してリンクされたスタティック ライブラリまたはオブジェクト ファイルは、マイナー バージョンの更新を含め、バージョン間でバイナリ互換性が "ありません"。 /GL/LTCG を使用してコンパイルされたオブジェクト ファイルとライブラリはすべて、コンパイルおよび最終リンクに対してまったく同じツールセットを使用する必要があります。 たとえば、isual Studio 2019 バージョン 16.7 ツールセット内で /GL を使用してビルドされたコードは、Visual Studio 2019 バージョン16.8 ツールセット内で /GL を使用してビルドされたコードにリンクすることはできません。 コンパイラによって、致命的なエラー C1047 が生成されます。

Visual Studio 2015 以降から Microsoft Visual C++ 再頒布可能パッケージをアップグレードする

Microsoft Visual C++ 再配布可能パッケージのメジャー バージョン番号は、Visual Studio 2015、2017、2019、2022 で同じように保持されています。 つまり、再頒布可能パッケージのインスタンスは一度に 1 つしかインストールできません。 既にインストールされている古いバージョンは、新しいバージョンによって上書きされます。 たとえば、あるアプリによって、Visual Studio 2015 から再頒布可能パッケージがインストールされる場合があります。 その後、別のアプリによって、Visual Studio 2022 から再頒布可能パッケージがインストールされます。 古いバージョンは、2022 バージョンによって上書きされますが、バイナリ互換性があるため、以前のアプリは引き続き正常に動作します。 最新バージョンの再頒布可能パッケージには、最新の機能、セキュリティ更新プログラム、バグ修正がすべて含まれていることが確認されています。 そのため、常に最新の利用可能なバージョンにアップグレードしておくことをお勧めします。

同様に、新しいバージョンの再頒布可能パッケージが既にインストールされている場合、古いバージョンをインストールすることはできません。 インストールしようとすると、インストーラーによってエラーが報告されます。 2022 バージョンがインストールされているコンピューターに 2017 または 2019 再頒布可能パッケージをインストールしようとすると、次のようなエラーが表示されます。

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.

これは仕様に基づくエラーです。 常に最新バージョンをインストールしておくことをお勧めします。 お使いのインストーラーがこのエラーから自動的に回復できることを確認します。

重要

Windows XP のランタイム ライブラリ サポートは、最新の Visual Studio の Visual C++ 再頒布可能パッケージでは使用できなくなりました。 Windows XP をサポートする最後の再頒布可能パッケージは、バージョン 16.7 (ファイル バージョン 14.27.29114.0) です。 ご利用の Windows XP アプリが最新バージョンの再頒布可能パッケージを使用して配置されているか、そのバージョンに更新されている場合、アプリは実行されません。 詳細情報、および Windows XP をサポートする再頒布可能パッケージのバージョンを取得する方法については、「Windows XP 用プログラムの構成」を参照してください。

関連項目

Visual C++ の変更履歴
サポートされている最新の Visual C++ 再頒布可能パッケージのダウンロード