CRT ライブラリの機能CRT Library Features

ここでは、C ランタイム ライブラリを構成するさまざまな .lib ファイル、および関連するコンパイラ オプションとプリプロセッサ ディレクティブについて説明します。This topic discusses the various .lib files that comprise the C run-time libraries as well as their associated compiler options and preprocessor directives.

C ランタイム ライブラリ (CRT)C Run-Time Libraries (CRT)

C ランタイム ライブラリ (CRT) は、ISO C99 標準ライブラリが組み込まれている C++ 標準ライブラリの一部です。The C Run-time Library (CRT) is the part of the C++ Standard Library that incorporates the ISO C99 standard library. この CRT を実装する Visual C++ ライブラリは、ネイティブ コードの開発と、ネイティブとマネージドの混在コードの開発をサポートします。The Visual C++ libraries that implement the CRT support native code development, and both mixed native and managed code. CRT のすべてのバージョンがマルチスレッド開発をサポートします。All versions of the CRT support multi-threaded development. ほとんどのライブラリが、ライブラリを直接コードにリンクする静的リンクと、コードで共通 DLL ファイルを使用できるようにする動的リンクの両方をサポートします。Most of the libraries support both static linking, to link the library directly into your code, or dynamic linking to let your code use common DLL files.

Visual Studio 2015 より、CRT が新しいバイナリにリファクタリングされました。Starting in Visual Studio 2015, the CRT has been refactored into new binaries. ユニバーサル CRT (UCRT) には、標準の C99 CRT ライブラリからエクスポートされた関数とグローバルが含まれています。The Universal CRT (UCRT) contains the functions and globals exported by the standard C99 CRT library. UCRT は Windows コンポーネントであり、Windows 10 の一部として出荷されます。The UCRT is now a Windows component, and ships as part of Windows 10. UCRT 用のスタティック ライブラリ、DLL インポート ライブラリ、およびヘッダー ファイルが Windows 10 SDK に含まれています。The static library, DLL import library, and header files for the UCRT are now found in the Windows 10 SDK. Visual C++ をインストールすると、Visual Studio セットアップによって、UCRT を使用するために必要な Windows 10 SDK のサブセットがインストールされます。When you install Visual C++, Visual Studio setup installs the subset of the Windows 10 SDK required to use the UCRT. UCRT は、Visual Studio 2015 以降のバージョンでサポートされている Windows の任意のバージョンで使用できます。You can use the UCRT on any version of Windows supported by Visual Studio 2015 and later versions. Windows 10 以外のサポートされているバージョンの Windows では、vcredist を使用して再配布することができます。You can redistribute it using vcredist for supported versions of Windows other than Windows 10. 詳細については、「 Redistributing Visual C++ Files」を参照してください。For more information, see Redistributing Visual C++ Files.

次の表に、UCRT を実装するライブラリの一覧を示します。The following table lists the libraries that implement the UCRT.

ライブラリLibrary 関連付けられている DLLAssociated DLL 特性Characteristics オプションOption プリプロセッサ ディレクティブPreprocessor directives
libucrt.liblibucrt.lib なしNone UCRT をコードに静的にリンクします。Statically links the UCRT into your code. /MT/MT _MT_MT
libucrtd.liblibucrtd.lib なしNone 静的リンク用の UCRT のデバッグ バージョン。Debug version of the UCRT for static linking. 再頒布可能パッケージではありません。Not redistributable. /MTd/MTd _DEBUG、_MT_DEBUG, _MT
ucrt.libucrt.lib ucrtbase.dllucrtbase.dll UCRT 用の DLL インポート ライブラリ。DLL import library for the UCRT. /MD/MD _MT、_DLL_MT, _DLL
ucrtd.libucrtd.lib ucrtbased.dllucrtbased.dll UCRT のデバッグ バージョン用の DLL インポート ライブラリ。DLL import library for the Debug version of the UCRT. 再頒布可能パッケージではありません。Not redistributable. /MDd/MDd _DEBUG、_MT、_DLL_DEBUG, _MT, _DLL

vcruntime ライブラリには、例外処理やデバッグ サポートなどの Visual C++ CRT 実装固有のコード、ランタイム チェックと型情報、実装の詳細、および特定の拡張ライブラリ関数が含まれています。The vcruntime library contains Visual C++ CRT implementation-specific code, such as exception handling and debugging support, runtime checks and type information, implementation details and certain extended library functions. このライブラリは、使用されているコンパイラのバージョンによって異なります。This library is specific to the version of the compiler used.

次の表に、vcruntime ライブラリを実装するライブラリの一覧を示します。This table lists the libraries that implement the vcruntime library.

ライブラリLibrary 関連付けられている DLLAssociated DLL 特性Characteristics オプションOption プリプロセッサ ディレクティブPreprocessor directives
libvcruntime.liblibvcruntime.lib なしNone コードに静的にリンクされています。Statically linked into your code. /MT/MT _MT_MT
libvcruntimed.liblibvcruntimed.lib なしNone 静的リンク用のデバッグ バージョン。Debug version for static linking. 再頒布可能パッケージではありません。Not redistributable. /MTd/MTd _MT、_DEBUG_MT, _DEBUG
vcruntime.libvcruntime.lib vcruntime<version>.dllvcruntime<version>.dll vcruntime 用の DLL インポート ライブラリ。DLL import library for the vcruntime. /MD/MD _MT、_DLL_MT, _DLL
vcruntimed.libvcruntimed.lib vcruntime<version>d.dllvcruntime<version>d.dll デバッグ vcruntime 用の DLL インポート ライブラリ。DLL import library for the Debug vcruntime. 再頒布可能パッケージではありません。Not redistributable. /MDd/MDd _DEBUG、_MT、_DLL_DEBUG, _MT, _DLL

注意

UCRT リファクタリングが行われたとき、同時実行ランタイムは concrt140.dll に移動されました。これは C++ 再頒布可能パッケージに含まれています。When the UCRT refactoring occurred, the Concurrency Runtime functions were moved into concrt140.dll, which was added to the C++ redistributable package. この DLL は、C++ の並列コンテナーおよびアルゴリズム (concurrency::parallel_for など) に必要となります。This DLL is required for C++ parallel containers and algorithms such as concurrency::parallel_for. さらに、C++ 標準ライブラリでは、同期プリミティブを支援するために、Windows XP でこの DLL を必要とします。Windows XP には条件変数がないためです。In addition, the C++ Standard Library requires this DLL on Windows XP to support synchronization primitives, because Windows XP does not have condition variables.

CRT を初期化するコードは、CRT ライブラリが静的にリンクされているのか、動的にリンクされているのか、ネイティブ コードなのか、マネージド コードなのか、混合コードなのかによって、複数あるライブラリのいずれかに含まれています。The code that initializes the CRT is in one of several libraries, based on whether the CRT library is statically or dynamically linked, or native, managed, or mixed code. このコードは、CRT のスタートアップ、内部スレッド単位データ初期化、および強制終了を処理します。This code handles CRT startup, internal per-thread data initialization, and termination. 使用されているコンパイラのバージョンによって異なります。It is specific to the version of the compiler used. このライブラリは、動的にリンクされた UCRT が使用されている場合でも、常に静的にリンクされます。This library is always statically linked, even when using a dynamically linked UCRT.

次の表に、CRT の初期化と強制終了を実装するライブラリの一覧を示します。This table lists the libraries that implement CRT initialization and termination.

ライブラリLibrary 特性Characteristics オプションOption プリプロセッサ ディレクティブPreprocessor directives
LIBCMT.liblibcmt.lib ネイティブ CRT スタートアップをコードに静的にリンクします。Statically links the native CRT startup into your code. /MT/MT _MT_MT
libcmtd.liblibcmtd.lib ネイティブ CRT スタートアップのデバッグ バージョンを静的にリンクします。Statically links the Debug version of the native CRT startup. 再頒布可能パッケージではありません。Not redistributable. /MTd/MTd _DEBUG、_MT_DEBUG, _MT
msvcrt.libmsvcrt.lib DLL UCRT および vcruntime で使用するためのネイティブ CRT スタートアップ用のスタティック ライブラリ。Static library for the native CRT startup for use with DLL UCRT and vcruntime. /MD/MD _MT、_DLL_MT, _DLL
msvcrtd.libmsvcrtd.lib DLL UCRT および vcruntime で使用するためのネイティブ CRT スタートアップのデバッグ バージョン用のスタティック ライブラリ。Static library for the Debug version of the native CRT startup for use with DLL UCRT and vcruntime. 再頒布可能パッケージではありません。Not redistributable. /MDd/MDd _DEBUG、_MT、_DLL_DEBUG, _MT, _DLL
msvcmrt.libmsvcmrt.lib DLL UCRT および vcruntime で使用するためのネイティブとマネージドの混合 CRT スタートアップ用のスタティック ライブラリ。Static library for the mixed native and managed CRT startup for use with DLL UCRT and vcruntime. /clr/clr
msvcmrtd.libmsvcmrtd.lib DLL UCRT および vcruntime で使用するためのネイティブとマネージドの混合 CRT スタートアップのデバッグ バージョン用のスタティック ライブラリ。Static library for the Debug version of the mixed native and managed CRT startup for use with DLL UCRT and vcruntime. 再頒布可能パッケージではありません。Not redistributable. /clr/clr
msvcurt.libmsvcurt.lib 非推奨 純粋マネージド CRT 用のスタティック ライブラリ。Deprecated Static library for the pure managed CRT. /clr:pure/clr:pure
msvcurtd.libmsvcurtd.lib 非推奨 純粋マネージド CRT のデバッグ バージョン用のスタティック ライブラリ。Deprecated Static library for the Debug version of the pure managed CRT. 再頒布可能パッケージではありません。Not redistributable. /clr:pure/clr:pure

C ランタイム ライブラリを指定するコンパイラ オプションを使用せずにコマンド ラインからプログラムをリンクした場合、リンカーは静的にリンクされた CRT ライブラリ (libcmt.lib、libvcruntime.lib、libucrt.lib) を使用します。If you link your program from the command line without a compiler option that specifies a C run-time library, the linker will use the statically linked CRT libraries: libcmt.lib, libvcruntime.lib, and libucrt.lib.

静的にリンクされた CRT を使用すると、暗黙的に、C ランタイム ライブラリによって保存されるステータス情報は CRT のそのインスタンスに対してローカルなものになります。Using the statically linked CRT implies that any state information saved by the C runtime library will be local to that instance of the CRT. たとえば、静的にリンクされた CRT を使用している状態で strtok、_strtok_l、wcstok、_wcstok_l、_mbstok、_mbstok_l を使用した場合、strtok パーサーの位置は、静的な CRT の別のインスタンスにリンクされた同じプロセス内 (ただし DLL または EXE は別) のコードで使用される strtok の状態とは無関係になります。For example, if you use strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l when using a statically linked CRT, the position of the strtok parser is unrelated to the strtok state used in code in the same process (but in a different DLL or EXE) that is linked to another instance of the static CRT. 反対に、動的にリンクされた CRT では、CRT に動的にリンクされるプロセス内のすべてのコードに対して状態が共有されます。In contrast, the dynamically linked CRT shares state for all code within a process that is dynamically linked to the CRT. この問題は、セキュリティが強化された新しいバージョンの関数では発生しません。たとえば、 strtok_s にはこの問題はありません。This concern does not apply if you use the new more secure versions of these functions; for example, strtok_s does not have this problem.

静的な CRT とのリンクによってビルドされた DLL は独自の CRT 状態を持つので、この結果を明確に理解し、期待する場合を除き、DLL 内で CRT に静的にリンクすることは推奨されません。Because a DLL built by linking to a static CRT will have its own CRT state, it is not recommended to link statically to the CRT in a DLL unless the consequences of this are specifically desired and understood. たとえば、独自の静的な CRT にリンクする DLL を読み込む実行可能ファイルで _set_se_translator を呼び出すと、このトランスレータは DLL 内のコードで生成されたハードウェア例外をキャッチしませんが、メインの実行可能ファイル内のコードによって生成されたハードウェア例外をキャッチします。For example, if you call _set_se_translator in an executable that loads the DLL linked to its own static CRT, any hardware exceptions generated by the code in the DLL will not be caught by the translator, but hardware exceptions generated by code in the main executable will be caught.

/clr コンパイラ スイッチを使用すると、コードはスタティック ライブラリ msvcmrt.lib とリンクされます。If you are using the /clr compiler switch, your code will be linked with a static library, msvcmrt.lib. このスタティック ライブラリは、マネージド コードとネイティブ CRT 間のプロキシを提供します。The static library provides a proxy between your managed code and the native CRT. /MT は、静的にリンクされる CRT ( /MTd オプションまたは /clrオプション) と一緒には使用できません。You cannot use the statically linked CRT ( /MT or /MTd options) with /clr. 代わりに、動的にリンクされるライブラリ (/MD または /MDd) を使用してください。Use the dynamically-linked libraries (/MD or /MDd) instead. 純粋マネージ CRT のライブラリは、Visual Studio 2015 で非推奨となり、Visual Studio 2017 ではサポートされていません。The pure managed CRT libraries are deprecated in Visual Studio 2015 and unsupported in Visual Studio 2017.

/clr と共に CRT を使用する方法の詳細については、「混在 (ネイティブおよびマネージド) アセンブリ」を参照してください。For more information on using the CRT with /clr, see Mixed (Native and Managed) Assemblies.

アプリケーションのデバッグ バージョンをビルドするには、_DEBUG フラグが定義され、アプリケーションが上の表のいずれかのライブラリのデバッグ バージョンとリンクされている必要があります。To build a debug version of your application, the _DEBUG flag must be defined and the application must be linked with a debug version of one of these libraries. ライブラリ ファイルのデバッグ バージョンの使い方の詳細については、「 CRT のデバッグ技術」を参照してください。For more information about using the debug versions of the library files, see CRT Debugging Techniques.

この CRT のバージョンは、C99 標準に完全には準拠していません。This version of the CRT is not fully conformant with the C99 standard. 具体的には、<tgmath.h> ヘッダーと CX_LIMITED_RANGE/FP_CONTRACT プラグマ マクロがサポートされていません。In particular, the <tgmath.h> header and the CX_LIMITED_RANGE/FP_CONTRACT pragma macros are not supported. 標準 IO 関数内のパラメーター指定子の意味などの特定の要素で、既定で、従来の解釈が使用されます。Certain elements such as the meaning of parameter specifiers in standard IO functions use legacy interpretations by default. /Zc コンパイラ準拠オプションを使用して、リンカー オプションを指定し、ライブラリ準拠の一部の側面を制御することができます。You can use /Zc compiler conformance options and specify linker options to control some aspects of library conformance,

C++ 標準ライブラリC++ Standard Library

C++ 標準ライブラリC++ Standard Library 特性Characteristics オプションOption プリプロセッサ ディレクティブPreprocessor directives
libcpmt.liblibcpmt.lib マルチスレッド、静的リンクMultithreaded, static link /MT/MT _MT_MT
msvcprt.libmsvcprt.lib マルチスレッド、動的リンク (MSVCPversion.dll 用のインポート ライブラリ)Multithreaded, dynamic link (import library for MSVCPversion.dll) /MD/MD _MT、_DLL_MT, _DLL
libcpmtd.liblibcpmtd.lib マルチスレッド、静的リンクMultithreaded, static link /MTd/MTd _DEBUG、_MT_DEBUG, _MT
msvcprtd.libmsvcprtd.lib マルチスレッド、動的リンク (MSVCPversionD.DLL 用のインポート ライブラリ)Multithreaded, dynamic link (import library for MSVCPversionD.DLL) /MDd/MDd _DEBUG、_MT、_DLL_DEBUG, _MT, _DLL

プロジェクトのリリース バージョンをビルドすると、既定では、選択したコンパイラ オプション (マルチスレッド、DLL、/clr) に応じて、基本 C ランタイム ライブラリ (libcmt.lib, msvcmrt.lib, msvcrt.lib) の 1 つがリンクされます。When you build a release version of your project, one of the basic C run-time libraries (libcmt.lib, msvcmrt.lib, msvcrt.lib) is linked by default, depending on the compiler option you choose (multithreaded, DLL, /clr). コードに C++ 標準ライブラリのヘッダー ファイルの 1 つがインクルードされている場合は、コンパイル時に Visual C++ によって自動的に C++ 標準ライブラリがリンクされます。If you include one of the C++ Standard Library header files in your code, a C++ Standard Library will be linked in automatically by Visual C++ at compile time. 次に例を示します。For example:

#include <ios>

バイナリの互換性のため、複数の DLL ファイルが 1 つのインポート ライブラリによって指定される場合があります。For binary compatibility, more than one DLL file may be specified by a single import library. バージョンの更新によって、ドット ライブラリが導入される場合があります。これは、新しいライブラリ機能が導入される別の DLL です。Version updates may introduce dot libraries, separate DLLs that introduce new library functionality. たとえば、Visual Studio 2017 バージョン 15.6 では、msvcp140.dll でサポートされる ABI を分断することなく追加の標準ライブラリ機能をサポートする msvcp140_1.dll が導入されました。For example, Visual Studio 2017 version 15.6 introduced msvcp140_1.dll to support additional standard library functionality without breaking the ABI supported by msvcp140.dll. Visual Studio 2017 バージョン 15.6 のツールセットに含まれる msvcprt.lib インポート ライブラリは両方の DLL をサポートし、このバージョンの vcredist は両方の DLL をインストールします。The msvcprt.lib import library included in the toolset for Visual Studio 2017 version 15.6 supports both DLLs, and the vcredist for this version installs both DLLs. 出荷後は、ドット ライブラリに修正された ABI が含まれ、以後のドット ライブラリに対する依存関係はなくなります。Once shipped, a dot library has a fixed ABI, and will never have a dependency on a later dot library.

アプリケーションで複数の CRT バージョンを使用した場合に発生する問題What problems exist if an application uses more than one CRT version?

すべての実行可能イメージ (EXE または DLL) は、静的にリンクされた独自の CRT を持たせるか、動的に CRT にリンクさせることができます。Every executable image (EXE or DLL) can have its own statically linked CRT, or can dynamically link to a CRT. 特定のイメージによって静的に含まれる、または動的に読み込まれる CRT のバージョンは、ビルド時に使用されたツールとライブラリのバージョンによって異なります。The version of the CRT statically included in or dynamically loaded by a particular image depends on the version of the tools and libraries it was built with. 1 つのプロセスが複数の EXE や DLL イメージを読み込み、そのそれぞれが独自の CRT を持っている場合があります。A single process may load multiple EXE and DLL images, each with its own CRT. これらの各 CRT は、異なる allocator を使用し、異なる内部構造体のレイアウトを備え、異なるストレージ配置を使用する可能性があります。Each of those CRTs may use a different allocator, may have different internal structure layouts, and may use different storage arrangements. つまり、メモリの割り当て、CRT リソース、DLL の境界を越えて渡されるクラスによって、メモリ管理、内部の static の使用、レイアウトの解釈に問題が発生する場合があります。This means that allocated memory, CRT resources, or classes passed across a DLL boundary can cause problems in memory management, internal static usage, or layout interpretation. たとえば、1 つの DLL に割り当てられているクラスが別の DLL に渡されて削除された場合、使用されるのはどの CRT の deallocator でしょうか。For example, if a class is allocated in one DLL but passed to and deleted by another, which CRT deallocator is used? 発生するエラーは微妙なものから即座に致命的となるものまでさまざまです。そのため、そのようなリソースを直接転送することは、回避することを強くお勧めします。The errors caused can range from the subtle to the immediately fatal, and therefore direct transfer of such resources is strongly discouraged.

代わりに、アプリケーション バイナリ インターフェイス (ABI) テクノロジを使用することで、この問題の多くを回避できます。安定しバージョン管理が可能であるように設計されるためです。You can avoid many of these issues by using Application Binary Interface (ABI) technologies instead, as they are designed to be stable and versionable. 値によって情報を渡すか、ローカルで割り当てたメモリを呼び出し元に返すのではなく呼び出し元によって渡されたメモリを使用するように、DLL のエクスポート インターフェイスを設計します。Design your DLL export interfaces to pass information by value, or to work on memory that is passed in by the caller rather than allocated locally and returned to the caller. マーシャリングの手法を使用して、実行可能イメージ間で構造化されたデータをコピーします。Use marshalling techniques to copy structured data between executable images. リソースをローカルでカプセル化し、クライアントに公開したハンドルまたは関数を通してのみこれを操作できるようにします。Encapsulate resources locally and only allow manipulation through handles or functions you expose to clients.

また、プロセス内のすべてのイメージで同じバージョンの CRT が動的に読み込まれる場合は、これらの問題を一部回避することもできます。It's also possible to avoid some of these issues if all of the images in your process use the same dynamically loaded version of the CRT. すべてのコンポーネントで CRT の同じ DLL バージョンを使用するには、/MD オプションを指定してビルドし、同じコンパイラ ツールセットとプロパティ設定を使用します。To ensure that all components use the same DLL version of the CRT, build them by using the /MD option, and use the same compiler toolset and property settings.

プログラムで DLL の境界を超えて特定の CRT リソース (ファイル ハンドル、ロケール、環境変数など) を渡す場合には、同じバージョンの CRT を使用する場合であっても、注意する必要があります。Some care is needed if your program passes certain CRT resources (such as file handles, locales and environment variables) across DLL boundaries, even when using the same version of the CRT. 発生する可能性のある問題とその対処法の詳細については、「DLL の境界を越えて CRT オブジェクトを渡す場合に発生する可能性のあるエラー」を参照してください。For more information on the issues involved and how to resolve them, see Potential Errors Passing CRT Objects Across DLL Boundaries.

関連項目See also