次の方法で共有


C ランタイム ライブラリ

更新 : 2007 年 11 月

ここでは、C ランタイム ライブラリを構成するさまざまな .lib ファイル、および関連するコンパイラ オプションとプリプロセッサ ディレクティブについて説明します。

C ランタイム ライブラリ (CRT)

次の表のライブラリには、C ランタイム ライブラリ関数が含まれています。

C ランタイム ライブラリ (iostream ライブラリと標準 C++ ライブラリを除く)

関連付けられている DLL

特性

オプション

プリプロセッサ ディレクティブ

libcmt.lib

なし、静的リンク

マルチスレッド、静的リンク

/MT

_MT

msvcrt.lib

msvcr90.dll

マルチスレッド、動的リンク (MSVCR90.DLL 用インポート ライブラリ)。標準 C++ ライブラリを使用する場合、プログラムの実行には MSVCP90.DLL が必要です。

/MD

_MT、_DLL

libcmtd.lib

なし、静的リンク

マルチスレッド、静的リンク (デバッグ)

/MTd

_DEBUG、_MT

msvcrtd.lib

msvcr90d.dll

マルチスレッド、動的リンク (MSVCR90D.DLL 用インポート ライブラリ) (デバッグ)

/MDd

_DEBUG、_MT、_DLL

msvcmrt.lib

msvcm90.dll

C ランタイム インポート ライブラリ。マネージ コードとネイティブ コードの混合コードに対して使用します。

/clr

 

msvcurt.lib

msvcm90.dll

100% 純粋な MSIL コードとしてコンパイルされた C ランタイム インポート ライブラリ。すべてのコードが MSIL 対応の ECMA URT 仕様に準拠します。

/clr:pure

 

abx4dbyh.alert_note(ja-jp,VS.90).gifメモ :

シングルスレッド CRT (libc.lib、libcd.lib) (以前の /ML オプションまたは /MLd オプション) は使用されなくなりました。代わりに、マルチスレッド CRT を使用します。マルチスレッド ライブラリのパフォーマンス を参照してください。

C ランタイム ライブラリを指定するコンパイラ オプションなしでコマンド ラインからプログラムにリンクする場合、リンカは LIBCMT.LIB を使用します。これは、シングルスレッド ライブラリの LIBC.LIB を使用していた以前のバージョンの Visual C++ とは異なります。

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

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

/clr コンパイラ スイッチを使用すると、コードはインポート ライブラリ msvcmrt.lib にリンクします。このインポート ライブラリは新しいライブラリ msvcm90.dll を参照します。この DLL は、マネージ コードとネイティブ CRT 間のプロキシを提供します。/clr で、静的にリンクされた CRT ( /MT オプションまたは /MTd オプション) を使用することはできません。動的にリンクされるライブラリ (/MD または /MDd) を使用してください。

/clr:pure コンパイラ スイッチを使用すると、コードはインポート ライブラリ msvcurt.lib にリンクします。このライブラリも msvcm90.dll を参照します。/clr と同様、静的にリンクされるライブラリにはリンクできません。

/clr で CRT の使い方の詳細については、「混在 (ネイティブおよびマネージ) アセンブリ」を参照してください。/clr:pure の詳細については、「純粋なコードと検証可能なコード」を参照してください。

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

このバージョンの Visual C++ は、C99 標準に準拠していません。

標準 C++ ライブラリ

標準 C++ ライブラリ

特性

オプション

プリプロセッサ ディレクティブ

LIBCPMT.LIB

マルチスレッド、静的リンク

/MT

_MT

MSVCPRT.LIB

マルチスレッド、動的リンク (MSVCP90.dll 用インポート ライブラリ)

/MD

_MT、_DLL

LIBCPMTD.LIB

マルチスレッド、静的リンク

/MTd

_DEBUG、_MT

MSVCPRTD.LIB

マルチスレッド、動的リンク (MSVCP90D.DLL 用インポート ライブラリ)

/MDd

_DEBUG、_MT、_DLL

メモ   Visual C++ 2005 から LIBCP.LIB および LIBCPD.LIB (以前の /ML オプションと /MLd オプションを使用) は削除されました。代わりに、/MT オプションと /MTd オプションを使用して LIBCPMT.LIB と LIBCPMTD.LIB を使用してください。

プロジェクトのリリース バージョンをビルドすると、既定では、選択したコンパイラ オプション (マルチスレッド、DLL、/clr) に応じて、基本 C ランタイム ライブラリ (LIBCMT.LIB、LIBCMT.LIB、MSVCRT.LIB) の 1 つがリンクされます。コードにStandard C++ Library Header Filesの 1 つが含まれている場合、コンパイル時、Visual C++ によって自動的に標準 C++ ライブラリにリンクされます。次に例を示します。

#include <ios> 

msvcrt.dll と msvcr90.dll の相違点

msvcrt.dll は "known DLL"、つまり、Windows が所有および構築するシステム コンポーネントになりました。msvcrt.dll は、システム レベルのコンポーネントだけで使用されることを前提としています。

アプリケーションで msvcrt.dll と msvcr90.dll の両方を使用した場合に発生する問題

msvcrt.lib にリンクする必要のある .lib ファイルや .obj ファイルがある場合は、Visual C++ 2008 の新しい msvcrt.lib を使用するためにファイルをコンパイルし直す必要はありません。.lib ファイルや .obj ファイルは、さまざまな CRT クラスや変数のサイズ、フィールド オフセット、またはメンバ関数名に依存している場合がありますが、それらはすべて互換性を保ったまま存続します。msvcrt.lib に再びリンクすると、最終的な EXE および DLL イメージは、msvcrt.dll ではなく、msvcr90.dll に対して依存関係を持つようになります。

複数の DLL または EXE がある場合は、異なるバージョンの Visual C++ を使用しているかどうかにかかわらず、複数の CRT が存在することがあります。たとえば、CRT を複数の DLL に静的にリンクした場合も、同じ問題が発生します。この静的 CRT の問題が発生した場合は、/MD でコンパイルして CRT DLL を使用するという対処が一般的でした。CRT DLL は、msvcr90.dll という名前に変更されたため、アプリケーションの一部のコンポーネントは msvcrt.dll にリンクされ、他のコンポーネントは msvcr90.dll にリンクされる場合があります。msvcrt.dll と msvcr90.dll の境界を越えて CRT リソースを渡す場合は、CRT の不一致によって問題が発生するため、Visual C++ 2008 でプロジェクトをコンパイルし直す必要があります。

複数のバージョンの CRT を使用するプロジェクトでは、DLL の境界を超えて特定の CRT オブジェクト (ファイル ハンドル、ロケール、環境変数など) を渡す場合には注意を要します。発生する可能性のある問題とその対処法の詳細については、「DLL の境界を越えて CRT オブジェクトを渡す場合に発生する可能性のあるエラー」を参照してください。

WinSxS グローバル アセンブリ キャッシュ内の標準ライブラリ

Visual C++ 2008 では、C および C++ のランタイム ライブラリ (msvcm90.dll、msvcm90d.dll など) はグローバル アセンブリ キャッシュに格納されます。

参照

その他の技術情報

ランタイム ライブラリ リファレンス