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 ツールセットによってビルドされたバイナリは、混在させることができます。 ただし、お使いのアプリ内の最新のバイナリと同じか、それ以上のバージョンのツールセットを使用してリンクする必要があります。 次に例を示します。2017 ツールセット (v141、バージョン 15.0 - 15.9) を使用してコンパイルされたアプリは、Visual Studio 2019 バージョン 16.2 (v142) を使用してコンパイルされたスタティック ライブラリにリンクできます。 バージョン16.2 以降のツールセットを使用して、それらをリンクさせるだけです。 バージョン 16.2 ライブラリとバージョン 16.4 アプリをリンクさせるには、16.4 以降のツールセットを使用します。
ご自身のアプリによって使用される再頒布可能パッケージにも、同様のバイナリ互換性の制限があります。 サポートされているさまざまなバージョンのツールセットでビルドされたバイナリを混在させる場合、再頒布可能パッケージのバージョンは、任意のアプリ コンポーネントで使用されている最新のツールセットと同じか、それ以上である必要があります。
/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 用プログラムの構成」を参照してください。