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 スタティック ライブラリとダイナミック リンク スタブ ライブラリは、プログラム ファイルまたはプログラム ファイル (x86) ディレクトリ Windows Kits\10\Lib\[sdk-version]\ucrt\[architecture]architecture (ARM64、x86、X64) にあります。 リテールおよびデバッグの静的ライブラリとlibucrt.liblibucrtd.lib、UCRT DLL のライブラリはucrt.libucrtd.lib次のとおりです。

製品版およびデバッグの UCRT DLL は、別々の場所にあります。 リテール DLL は再頒布可能ファイルであり、Program Files または Program Files (x86) ディレクトリの下にありますWindows Kits\10\Redist\ucrt\DLLs\[architecture]\。 デバッグ 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] ライブラリのビルド バージョンを示します。

リンク ライブラリは、[year]Visual Studio のバージョン、Visual Studio のエディションまたはニックネーム、[edition]ライブラリのビルド バージョン、[lib-version]ターゲット [architecture] プロセッサ アーキテクチャの下Microsoft Visual Studio\[year]\[edition]\VC\Tools\MSVC\[lib-version]\lib\[architecture]にあります。 OneCore とストアのリンク ライブラリは、libraries フォルダーにもあります。

スタティック ライブラリのリテール バージョンとデバッグ バージョンは libvcruntime.lib 次のとおりです libvcruntimed.lib。 ダイナミック リンク リテール ライブラリとデバッグ スタブ ライブラリはそれぞれ vcruntime.lib 、それぞれです vcruntimed.lib

Visual Studio C++ プロジェクトを更新するときに、プロジェクトのリンカー プロパティ [既定のライブラリをすべて無視] を [はい] に設定した場合、またはコマンド ラインでリンカー オプションを使用/NODEFAULTLIBする場合は、ライブラリの一覧を更新して、リファクタリングされた新しいライブラリを含める必要があります。 古い CRT ライブラリ (たとえば、 libcmt.lib、、 libcmtd.libmsvcrt.libまたは msvcrtd.lib) を、同等のリファクタリングされたライブラリに置き換えます。 使用する特定のライブラリについては、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 より前の vcredist サポートされているバージョンの Windows のパッケージを使用して再配布できます。 パッケージには vcredist UCRT コンポーネントが含まれており、既定ではインストールされていない Windows オペレーティング システムに自動的にインストールされます。 詳細については、「Visual C++ ファイルの再配布」を参照してください。

UCRT のアプリのローカルの展開がサポートされていますが、パフォーマンスとセキュリティの両方の理由から推奨されません。 UCRT のアプリローカル展開用の DLL は、Windows SDK の一部としてサブディレクトリの下に redist 含まれています。 必要な DLL には、名前が付いた api-ms-win-[subset].dllAPISet フォワーダー DLL のセットが含まれますucrtbase.dll。 必要な DLL のセットはオペレーティング システムごとに異なるので、アプリのローカルの展開を使用するときにはすべての DLL を含めることをお勧めします。 アプリローカル展開の詳細と推奨事項については、「Visual C++ での配置」を参照してください

ユニバーサル 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++ 準拠の強化