次の方法で共有


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++ 再頒布可能パッケージのダウンロード