C ランタイム (CRT) ファイルと C++ 標準ライブラリ (STL) .lib ファイル

このトピックでは、アプリケーションの開発時にリンクできる Microsoft C ランタイム ライブラリ ファイルと、関連するコンパイラ オプションとプリ .lib プロセッサ ディレクティブの一覧を示します。

アプリケーション をサポートするためにVisual C++ C ランタイム ファイルのデプロイに関する情報を探している場合は、「ファイルの再配布」を参照してください。

C ランタイム ライブラリの API リファレンスを探している場合は、「C ランタイム ライブラリ リファレンス」を参照してください。

C ランタイム .lib ファイル

C ランタイム ライブラリ (CRT) は、ISO C 標準ライブラリを組み込んだ C++ 標準ライブラリの一部です。 この CRT を実装する Visual C++ ライブラリは、ネイティブ コードの開発と、ネイティブとマネージドの混在コードの開発をサポートします。 CRT のすべてのバージョンがマルチスレッド開発をサポートします。 ほとんどのライブラリが、ライブラリを直接コードにリンクする静的リンクと、コードで共通 DLL ファイルを使用できるようにする動的リンクの両方をサポートします。

Visual Studio 2015 より、CRT が新しいバイナリにリファクタリングされました。 ユニバーサル CRT (UCRT) には、標準の C99 CRT ライブラリからエクスポートされた関数とグローバルが含まれています。 UCRT は現在、Windowsコンポーネントであり、以降のバージョンWindows 10として出荷されています。 UCRT のスタティック ライブラリ、DLL インポート ライブラリ、およびヘッダー ファイルは、Windows SDK にあります。 アプリケーションをインストールVisual C++、Visual Studio UCRT を使用するために必要な Windows SDK のサブセットがインストールされます。 UCRT は、Visual Studio 2015 以降のバージョンでサポートされている Windows の任意のバージョンで使用できます。 vcredist を使用して、サポートされているバージョンの Windows以外のバージョンWindows 10再配布できます。 詳細については、「Visual C++ ファイルの再配布」を参照してください。

次の表に、UCRT を実装するライブラリの一覧を示します。

ライブラリ 関連付けられている DLL 特性 オプション プリプロセッサ ディレクティブ
libucrt.lib なし UCRT をコードに静的にリンクします。 /MT _MT
libucrtd.lib なし 静的リンク用の UCRT のデバッグ バージョン。 再頒布可能パッケージではありません。 /MTd _DEBUG, _MT
ucrt.lib ucrtbase.dll UCRT 用の DLL インポート ライブラリ。 /MD _MT, _DLL
ucrtd.lib ucrtbased.dll UCRT のデバッグ バージョン用の DLL インポート ライブラリ。 再頒布可能パッケージではありません。 /MDd _DEBUG, _MT, _DLL

vcruntime ライブラリには、例外処理やデバッグ サポートなどの Visual C++ CRT 実装固有のコード、ランタイム チェックと型情報、実装の詳細、および特定の拡張ライブラリ関数が含まれています。 vcruntime ライブラリのバージョンは、使用しているコンパイラのバージョンと一致している必要があります。

次の表に、vcruntime ライブラリを実装するライブラリの一覧を示します。

ライブラリ 関連付けられている DLL 特性 オプション プリプロセッサ ディレクティブ
libvcruntime.lib なし コードに静的にリンクされています。 /MT _MT
libvcruntimed.lib なし 静的リンク用のデバッグ バージョン。 再頒布可能パッケージではありません。 /MTd _MT, _DEBUG
vcruntime.lib vcruntime<version>.dll vcruntime 用の DLL インポート ライブラリ。 /MD _MT, _DLL
vcruntimed.lib vcruntime<version>d.dll デバッグ vcruntime 用の DLL インポート ライブラリ。 再頒布可能パッケージではありません。 /MDd _DEBUG, _MT, _DLL

注意

UCRT がリファクタリングされた同時実行ランタイム関数が に移動され、C++ 再頒布可能パッケージ concrt140.dll に追加されました。 この DLL は、C++ の並列コンテナーおよびアルゴリズム (concurrency::parallel_for など) に必要となります。 さらに、C++ 標準ライブラリでは、同期プリミティブをサポートするために Windows XP でこの DLL が必要です。これは、Windows XP には条件変数が存在しないのでです。

CRT を初期化するコードは、CRT ライブラリが静的にリンクされているのか、動的にリンクされているのか、ネイティブ コードなのか、マネージド コードなのか、混合コードなのかによって、複数あるライブラリのいずれかに含まれています。 このコードは、CRT のスタートアップ、内部スレッド単位データ初期化、および強制終了を処理します。 これは、使用されるコンパイラのバージョンに固有です。 このライブラリは、動的にリンクされた UCRT が使用されている場合でも、常に静的にリンクされます。

次の表に、CRT の初期化と強制終了を実装するライブラリの一覧を示します。

ライブラリ 特性 オプション プリプロセッサ ディレクティブ
libcmt.lib ネイティブ CRT スタートアップをコードに静的にリンクします。 /MT _MT
libcmtd.lib ネイティブ CRT スタートアップのデバッグ バージョンを静的にリンクします。 再頒布可能パッケージではありません。 /MTd _DEBUG, _MT
msvcrt.lib DLL UCRT および vcruntime で使用するためのネイティブ CRT スタートアップ用のスタティック ライブラリ。 /MD _MT, _DLL
msvcrtd.lib DLL UCRT および vcruntime で使用するためのネイティブ CRT スタートアップのデバッグ バージョン用のスタティック ライブラリ。 再頒布可能パッケージではありません。 /MDd _DEBUG, _MT, _DLL
msvcmrt.lib DLL UCRT および vcruntime で使用するためのネイティブとマネージドの混合 CRT スタートアップ用のスタティック ライブラリ。 /clr
msvcmrtd.lib DLL UCRT および vcruntime で使用するためのネイティブとマネージドの混合 CRT スタートアップのデバッグ バージョン用のスタティック ライブラリ。 再頒布可能パッケージではありません。 /clr
msvcurt.lib 非推奨 純粋マネージド CRT 用のスタティック ライブラリ。 /clr:pure
msvcurtd.lib 非推奨 純粋マネージド CRT のデバッグ バージョン用のスタティック ライブラリ。 再頒布可能パッケージではありません。 /clr:pure

C ランタイム ライブラリを指定するコンパイラ オプションを使用せずにコマンド ラインからプログラムをリンクすると、リンカーは静的にリンクされた CRT ライブラリ libcmt.liblibvcruntime.lib 、、および を使用します libucrt.lib

静的にリンクされた CRT を使用すると、暗黙的に、C ランタイム ライブラリによって保存されるステータス情報は CRT のそのインスタンスに対してローカルなものになります。 たとえば、静的にリンクされた CRT を使用するときに を使用する場合、パーサーの位置は、静的 CRT の別のインスタンスにリンクされている同じプロセス (ただし、別の DLL または strtokstrtokstrtok EXE) 内のコードで使用される状態とは無関係です。 反対に、動的にリンクされた CRT では、CRT に動的にリンクされるプロセス内のすべてのコードに対して状態が共有されます。 これらの関数のより安全な新しいバージョンを使用する場合、この問題は適用されません。たとえば、 strtok_s にはこの問題はありません。

静的 CRT にリンクしてビルドされた DLL は独自の CRT 状態を持つため、その結果が特に望ましい場合や理解されていない限り、DLL 内の CRT に静的にリンクすることが推奨されません。 たとえば、独自の静的 CRT にリンクされた DLL を読み込む実行可能ファイルで を呼び出した場合、DLL 内のコードによって生成されたハードウェア例外はトランスレーターによってキャッチされませんが、メイン実行可能ファイルのコードによって生成されたハードウェア例外はキャッチされます。 _set_se_translator

コンパイラ スイッチを使用している場合、コードはスタティック ライブラリ /clr msvcmrt.lib にリンクされます。 このスタティック ライブラリは、マネージド コードとネイティブ CRT 間のプロキシを提供します。 で静的にリンクされた CRT ( または /MT/MTd オプション) を使用することはできません /clr 。 代わりに、動的にリンクされたライブラリ ( /MD または /MDd ) を使用してください。 純粋マネージ CRT のライブラリは、Visual Studio 2015 で非推奨となり、Visual Studio 2017 ではサポートされていません。

で CRT を使用する方法の詳細については、「混合 /clr (ネイティブおよびマネージド) アセンブリ /clr

アプリケーションのデバッグ バージョンをビルドするには、 フラグを定義し、アプリケーションをこれらのライブラリのいずれかのデバッグ バージョンにリンク _DEBUG する必要があります。 ライブラリ ファイルのデバッグ バージョンの使い方の詳細については、「 CRT のデバッグ技術」を参照してください。

このバージョンの CRT は、C99 標準に完全に準拠しているのではない。 2019 Visual Studio 16.8 より前のバージョンでは < 、tgmath.h ヘッダー > はサポートされていません。 すべてのバージョンで、 CX_LIMITED_RANGE および FP_CONTRACT プラグマ マクロはサポートされていません。 標準 IO 関数内のパラメーター指定子の意味などの特定の要素で、既定で、従来の解釈が使用されます。 コンパイラ準拠オプション /Zc を使用し、リンカー オプションを指定して、ライブラリの準拠の一部の側面を制御できます。

C++ 標準ライブラリ .lib ファイル

C++ 標準ライブラリ 特性 オプション プリプロセッサ ディレクティブ
libcpmt.lib マルチスレッド、静的リンク /MT _MT
msvcprt.lib マルチスレッド、ダイナミック リンク (のインポート ライブラリ msvcp<version>.dll ) /MD _MT, _DLL
libcpmtd.lib マルチスレッド、静的リンク /MTd _DEBUG, _MT
msvcprtd.lib マルチスレッド、ダイナミック リンク (のインポート ライブラリ msvcp<version>d.dll ) /MDd _DEBUG, _MT, _DLL

プロジェクトのリリース バージョンをビルドすると、選択したコンパイラ オプション (マルチスレッド、DLL、) に応じて、基本的な C ランタイム ライブラリ libcmt.libmsvcmrt.libmsvcrt.lib (、、) の 1 つが既定でリンクされます /clr 。 コードに C++ 標準ライブラリ ヘッダー ファイルのいずれかを含める場合、C++ 標準ライブラリは、コンパイル時に Visual C++によって自動的にリンクされます。 例:

#include <ios>

バイナリの互換性のため、複数の DLL ファイルが 1 つのインポート ライブラリによって指定される場合があります。 バージョンの更新によって、ドット ライブラリが導入される場合があります。これは、新しいライブラリ機能が導入される別の DLL です。 たとえば、2017 Visual Studio 15.6 では、 でサポートされているアプリケーション バイナリ インターフェイス (ABI) を壊さずに、追加の標準ライブラリ機能をサポートするために導入 msvcp140_1.dll されました msvcp140.dll 。 Visual Studio 2017 バージョン 15.6 のツールセットに含まれているインポート ライブラリは両方の DLL をサポートし、このバージョンの vcredist は両方の DLL をインストールします。 msvcprt.lib 出荷後は、ドット ライブラリに修正された ABI が含まれ、以後のドット ライブラリに対する依存関係はなくなります。

アプリケーションで複数の CRT バージョンを使用した場合に発生する問題

すべての実行可能イメージ (EXE または DLL) は、静的にリンクされた独自の CRT を持たせるか、動的に CRT にリンクさせることができます。 特定のイメージによって静的に含まれる、または動的に読み込まれる CRT のバージョンは、ビルド時に使用されたツールとライブラリのバージョンによって異なります。 1 つのプロセスが複数の EXE や DLL イメージを読み込み、そのそれぞれが独自の CRT を持っている場合があります。 これらの各 CRT は、異なる allocator を使用し、異なる内部構造体のレイアウトを備え、異なるストレージ配置を使用する可能性があります。 つまり、割り当てられたメモリ、CRT リソース、または DLL 境界を越えて渡されたクラスは、メモリ管理、内部静的使用、またはレイアウト解釈で問題が発生する可能性があります。 たとえば、1 つの DLL に割り当てられているクラスが別の DLL に渡されて削除された場合、使用されるのはどの CRT の deallocator でしょうか。 発生するエラーは微妙なものから即座に致命的となるものまでさまざまです。そのため、そのようなリソースを直接転送することは、回避することを強くお勧めします。

代わりに、アプリケーション バイナリ インターフェイス (ABI) テクノロジを使用することで、この問題の多くを回避できます。安定しバージョン管理が可能であるように設計されるためです。 値によって情報を渡すか、ローカルで割り当てたメモリを呼び出し元に返すのではなく呼び出し元によって渡されたメモリを使用するように、DLL のエクスポート インターフェイスを設計します。 マーシャリング手法を使用して、実行可能イメージ間で構造化データをコピーします。 リソースをローカルでカプセル化し、クライアントに公開したハンドルまたは関数を通してのみこれを操作できるようにします。

また、プロセス内のすべてのイメージで同じバージョンの CRT が動的に読み込まれる場合は、これらの問題を一部回避することもできます。 すべてのコンポーネントが同じ DLL バージョンの CRT を使用するには、 オプションを使用してビルドし、同じコンパイラ ツールセットとプロパティ設定 /MD を使用します。

プログラムが DLL の境界を越えて特定の CRT リソースを渡す場合は注意してください。 ファイル ハンドル、ローカル変数、環境変数などのリソースは、同じバージョンの CRT を使用している場合でも問題を引き起こす可能性があります。 発生する可能性のある問題とその対処法の詳細については、「DLL の境界を越えて CRT オブジェクトを渡す場合に発生する可能性のあるエラー」を参照してください。

関連項目

C ランタイム ライブラリ リファレンス
Visual C++ ファイルの再配布