vc \ libには、4つのバージョンのCRTリンクライブラリがあります。
- libcmt.lib:リリースビルド(/ MT)の静的CRTリンクライブラリ
- 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コメントディレクティブを無視するようにリンカーに指示します。これはうまくいくかもしれませんが、他の多くのリンカエラーは珍しいことではありません。errnoのようなもので、静的CRTバージョンではextern intですが、DLLバージョンでは関数にマクロ変換されます。他の多くの人もそうです。
さて、この問題を正しい方法で修正し、リンクしている.objまたは.libファイルを、間違った/ Mオプションを使用してコンパイルしたものを見つけます。手がかりがない場合は、「/ MT」の.obj / .libファイルをgrepすることで見つけることができます。
ところで:Windows実行可能ファイル(version.dllなど)には、仕事を完了するための独自のCRTバージョンがあります。これはc:\ windows \ system32にあり、独自のプログラムで確実に使用することはできません。CRTヘッダーはどこでも使用できません。プログラムで使用されるCRT DLLの名前が異なります(msvcrt90.dllなど)。