vc\lib には、CRT リンク ライブラリの 4 つのバージョンがあります。
- libcmt.lib: リリース ビルド用の静的 CRT リンク ライブラリ (/MT)
- libcmtd.lib: デバッグ ビルド用の静的 CRT リンク ライブラリ (/MTd)
- msvcrt.lib: CRT (/MD) のリリース DLL バージョンのインポート ライブラリ
- msvcrtd.lib: CRT のデバッグ DLL バージョンのインポート ライブラリ (/MDd)
リンカー オプション、プロジェクト + プロパティ、リンカー、コマンド ラインを見てください。これらのライブラリがここで言及されていないことに注意してください。リンカは、コンパイラによってどの /M スイッチが使用されたか、および #pragma コメント ディレクティブを使用してどの .lib をリンクする必要があるかを自動的に判断します。ちょっと重要なことですが、/M オプションとリンクする .lib の間に不一致があると、恐ろしいリンク エラーが発生し、実行時エラーを診断するのが難しくなります。
リンカが msvcrt.libとlibcmt.libの両方にリンクするように指示されると、引用したエラー メッセージが表示されます。これは、/MT でコンパイルされたコードを /MD でリンクされたコードとリンクすると発生します。CRT のバージョンは 1 つだけです。
/NODEFAULTLIB は、/MT コンパイル コードから生成された #pragma コメント ディレクティブを無視するようにリンカーに指示します。これは機能する可能性がありますが、他の多くのリンカー エラーは珍しくありません。静的 CRT バージョンでは extern int ですが、DLL バージョンでは関数にマクロ化されているerrnoのようなもの。他の多くの人はそれが好きです。
さて、この問題を正しい方法で修正し、間違った /M オプションでコンパイルされた、リンクしている .obj または .lib ファイルを見つけます。手がかりがない場合は、「/ MT」の.obj/.libファイルをgrepすることで見つけることができます
ところで、Windows 実行可能ファイル (version.dll など) には、ジョブを完了するための独自の CRT バージョンがあります。これは c:\windows\system32 にあります。独自のプログラムで確実に使用することはできません。その CRT ヘッダーはどこにもありません。プログラムで使用される CRT DLL の名前が異なります (msvcrt90.dll など)。