Universal CRT へのコードのアップグレード
Microsoft C ランタイム ライブラリ (CRT) は Visual Studio 2015 でリファクタリングされました。 標準 C ライブラリ、POSIX の拡張機能、および Microsoft 固有の関数、マクロ、グローバル変数は、ユニバーサル C ランタイム ライブラリ (ユニバーサル CRT または UCRT) という新しいライブラリに移動されました。 CRT のコンパイラ固有のコンポーネントは、新しい vcruntime ライブラリに移動されました。
UCRT は Windows コンポーネントになり、Windows 10 以降の一部として出荷されます。 UCRT は、C の呼び出し規約に基づく安定した ABI をサポートし、わずかな例外がありますが、ISO C99 標準に厳密に準拠しています。 コンパイラの特定のバージョンに関連付けられなくなりました。 UCRT は、Visual Studio 2015 または Visual Studio 2017 でサポートされている Windows の任意のバージョンで使用できます。 利点は、Visual Studio のアップグレードのたびに、CRT の新しいバージョンを対象に、ビルドを更新する必要がなくなったことです。
このリファクタリングにより、多くの CRT ヘッダー ファイル、ライブラリ ファイル、再頒布可能ファイルの名前または場所、およびコードに必要な展開方法が変更されました。 UCRT の多くの関数とマクロも、標準準拠を向上させるために追加または変更されました。 これらの変更を利用するには、既存のコードとプロジェクトビルドシステムを更新する必要があります。
ユニバーサル CRT ファイルの場所
Windows コンポーネントと同じように、UCRT ライブラリのファイルとヘッダーは現在、Windows ソフトウェア開発キット (SDK) の一部です。 Visual Studio をインストールするときに、UCRT を使用するために必要な Windows SDK の一部もインストールされます。 Visual Studio インストーラーでは、Visual Studio のプロジェクト ビルド システムで使用される既定のパスに、UCRT ヘッダー、ライブラリ、および DLL ファイルの場所が追加されます。 Visual Studio C++ プロジェクトを更新するときに、既定のプロジェクト設定を使用している場合、IDE はヘッダー ファイルの新しい場所を自動的に検索します。 また、リンカーは新しい既定の UCRT ライブラリと vcruntime ライブラリを自動的に使用します。 同様に、Developer コマンド プロンプトを使用してコマンド ライン ビルドを実行する場合、ヘッダーとライブラリのパスを含む環境変数が更新され、こちらも自動的に動作します。
標準 C ライブラリ ヘッダー ファイルが、Windows SDK に含まれるようになり、SDK バージョン固有のディレクトリのインクルード フォルダーに置かれます。 ヘッダー ファイルの一般的な場所は、 Program Files または Program Files (x86) ディレクトリ内 Windows Kits\10\Include\[sdk-version]\ucrt
にあります。ここで、 [sdk-version]
は Windows バージョンまたは更新プログラム (Windows 10 の Anniversary Update の場合は 10.0.14393.0 など) に対応します。
UCRT スタティック ライブラリとダイナミック リンク スタブ ライブラリは、 Program Files または Program Files (x86)) ディレクトリ内 Windows Kits\10\Lib\[sdk-version]\ucrt\[architecture]
にあります。 architecture
は ARM64、x86、または X64 です。 リテールおよびデバッグの静的ライブラリは libucrt.lib
され、 libucrtd.lib
され、UCRT DLL のライブラリは ucrt.lib
され、 ucrtd.lib
されます。
製品版およびデバッグの UCRT DLL は、別々の場所にあります。 リテール DLL は再頒布可能ファイルであり、Windows Kits\10\Redist\ucrt\DLLs\[architecture]\
の下の Program Files または Program Files (x86) ディレクトリにあります。 デバッグ UCRT ライブラリは再頒布可能ファイルではなく、 Program Files または Program Files (x86) ディレクトリ Windows Kits\10\bin\[architecture]\ucrt
フォルダーにあります。
標準ライブラリとヘッダーを検索する場所
C および C++ コンパイラ固有のランタイム サポート ライブラリ ( vcruntime
) には、プログラムの起動をサポートするために必要なコードと、例外処理や組み込み関数などの機能が含まれています。 ライブラリとそのヘッダー ファイルは、 Program Files または Program files (x86) ディレクトリ内のバージョン固有の Microsoft Visual Studio フォルダーにあります。
Visual Studio 2017、2019、2022 では、ヘッダー ファイルは Microsoft Visual Studio\[year]\[edition]\VC\Tools\MSVC\[lib-version]\include
にあります。 ここでは、 [year]
は Visual Studio のバージョン、 [edition]
は Visual Studio のエディションまたはニックネーム、 [lib-version]
はライブラリのビルド バージョンです。
リンク ライブラリは Microsoft Visual Studio\[year]\[edition]\VC\Tools\MSVC\[lib-version]\lib\[architecture]
にあります。 [year]
は Visual Studio のバージョン、 [edition]
は Visual Studio のエディションまたはニックネーム、 [lib-version]
はライブラリのビルド バージョン、 [architecture]
はターゲット プロセッサ アーキテクチャです。 OneCore とストアのリンク ライブラリは、libraries フォルダーにもあります。
スタティック ライブラリのリテール バージョンとデバッグ バージョンは libvcruntime.lib
され、 libvcruntimed.lib
。 ダイナミック リンクリテールライブラリとデバッグスタブライブラリはそれぞれ vcruntime.lib
され、 vcruntimed.lib
されます。
Visual Studio C++ プロジェクトを更新するときに、プロジェクトの Linker プロパティ すべての既定のライブラリ を Yes に設定している場合、またはコマンド ラインで /NODEFAULTLIB
リンカー オプションを使用する場合は、ライブラリの一覧を更新して、新しいリファクタリングされたライブラリを含める必要があります。 libcmt.lib
、libcmtd.lib
、msvcrt.lib
、msvcrtd.lib
などの古い CRT ライブラリを、同等のリファクタリングされたライブラリに置き換えます。 使用する特定のライブラリについては、「 CRT ライブラリ機能を参照してください。
ユニバーサル CRT の配置と再配布
UCRT は Microsoft Windows オペレーティング システム コンポーネントになったため、Windows 10 以降のオペレーティング システムの一部として含まれています。 Windows Vista から Windows 8.1 までの古いオペレーティング システムの場合、Windows Update から入手できます。 再頒布可能パッケージのバージョンは、Windows XP で使用できます。 オペレーティング システム コンポーネントとして、UCRT の更新プログラムとサービスは、Visual Studio および Microsoft C++ コンパイラのバージョンとは無関係に、Windows Update によって管理されます。 UCRT は Windows コンポーネントであるため、セキュリティと更新の容易さ、およびイメージ サイズを小さくするため、再頒布可能パッケージを使用してアプリの UCRT を一元的に展開することを強くお勧めします。
UCRT は、Visual Studio 2015 以降でサポートされている Windows の任意のバージョンで使用できます。 Windows 10 より前のサポートされているバージョンの Windows 用の vcredist
パッケージを使用して再配布できます。 vcredist
パッケージには UCRT コンポーネントが含まれており、既定ではインストールされていない Windows オペレーティング システムに自動的にインストールされます。 詳細については、「Visual C++ ファイルの再配布」を参照してください。
UCRT のアプリのローカルの展開がサポートされていますが、パフォーマンスとセキュリティの両方の理由から推奨されません。 UCRT のアプリローカル展開用の DLL は、Windows SDK の一部として、 redist
サブディレクトリの下に含まれています。 必要な DLL には、ucrtbase.dll
と、api-ms-win-[subset].dll
という名前の
ユニバーサル CRT 関数およびマクロの変更
UCRT では、ISO C99 への準拠を改善し、コードの品質およびセキュリティの問題を解決するために、多くの関数が追加または更新されました。 このために、ライブラリの大幅な変更が必要な場合もありました。 以前のバージョンの CRT を使用しているときにクリーンにコンパイルされたコードは、UCRT を使用してコンパイルすると中断する可能性があります。 その場合は、UCRT の更新と機能を利用するようにコードを変更する必要があります。 ユニバーサル CRT での CRT の重大な変更と更新の詳細については、Visual C++ の変更履歴の「C Runtime Library (CRT)」 (C ランタイム ライブラリ (CRT)) セクションを参照してください。 コードに必要な変更を識別するために使用できる影響を受けるヘッダーと関数の一覧が含まれています。
関連項目
Visual C++ 移植とアップグレードのガイド
アップグレードに関する潜在的な問題 (Visual C++) の概要
旧バージョンの Visual C++ からのプロジェクトのアップグレード
Visual C++ 2003 ~ 2015 の変更履歴
Visual Studio の C++ 準拠の強化