この質問にはいくつかの部分があります:コンパイラ/リンカに "デバッグ情報"(ソースコードとオブジェクトコード間のマッピング)を生成し保存する方法、コードを別の方法でコンパイルするようにコンパイラに指示する方法デバッグを簡単にする(assert()と#ifdef _DEBUGを考えてください)、プロジェクトにリンクしているプリコンパイルされたライブラリにデバッグ情報が含まれているかどうかを確認します。
-Zi(デバッグ情報を生成するようにCLコンパイラに指示するフラグ)は、gccの-gフラグと同じです。
(他にも-Zオプションがあります:Visual Studio IDEで「編集と継続」をサポートしたい場合は-ZIですが、IDEを使用している場合は、コンパイラの設定を直接操作するのではなく、-Z7を使用して、古いCodeView形式のデバッグ情報が必要な場合は、CLを直接呼び出すときは常に-Ziを使用していました)。
-Ziまたは-ZI)オプションを使用すると、通常ディレクトリごとに.pdbファイルが生成されますが、コードをまとめてリンクするときは、異なる.pdbファイルで表される.objファイルからのものである可能性があります。あなたが一緒にリンクしたコードを表すマスターの1つです。これが、リンカーの-debugスイッチの目的です。
注:これは直観に反するかもしれませんが、常に-Zi(CLの場合)および-debug(link.exeの場合)を使用してください。コードでさえ、あなたは解放しようとしています。デバッグ情報は個別の.pdbファイル(顧客には出荷されません)に格納されるため、実行可能ファイルのサイズを増やすことも、秘密情報を顧客に与えることもありません。デバッグする必要がある場合は、.pdbが必要になります。 (-Ziは最適化との互換性もなく、-ZIであるため、-ZIで "デバッグ"ビルドをコンパイルし、 "-Zi -O2"で "リリース"ビルドをコンパイルしたい場合があります)
ライブラリについては、Cランタイムライブラリのデバッグ/リリースプロパティを厳密に一致させる必要はありませんが、コードにデバッグ情報が含まれているかどうかを確認する必要がありますが、通常は良いアイデアです - 必要なプロジェクトをデバッグする場合それをすべてデバッグできるようにする必要があります。デバッグしない場合は、余分な重量を必要としません。与えられたライブラリのデバッグ/リリース版を使用しても、デバッグシンボルがあるかどうかには影響しません(ライブラリをコンパイルした人が前の段落で作ったポイントを理解してくれればうれしく思いますが)、assertとextra #ifdef _DEBUGそのライブラリ内のコード。
これは、あなたがリンクしているすべてのライブラリ、特にCランタイムライブラリに適用されます。Microsoftはmalloc()とfree()に余分なエラー検出コードを追加しました。あなたのプロジェクトの中にCRTライブラリのデバッグフレーバーを使用しているものがあれば、そのすべてが必要です。
/Mオプション(/ MTdと/ MDd)は、私の意見では奇妙で魔法です。背後にある複雑な他のもののエイリアスです。たとえば、_DEBUG、_MT、および_DLLを定義し、アプリケーションにデバッグマルチスレッドおよびDLL固有のバージョンのランタイムライブラリを使用させます。また、コンパイラはライブラリ名MSVCRTDを配置します。 libを.objファイルに追加します。ここでは、プリプロセッサ(_DEBUGとその他のプリプロセッサシンボルの定義)とリンカ(実際にはソースコードに#pragma comment(リンカ)を置く)の両方に影響します。何が起こっているのか気にしていないのであれば、これは本当の問題を引き起こす可能性があります - 私は、IDEを使用しない多くのプロジェクトがmsvcrt.libとmsvcrtd.libあなたがこれらの(/ Mオプション)を安全に使う方法を理解するときには、あなたはそれらをもう本当に必要としません!私は物事を明示的にすることを好む:必要なところで直接 "-D _DEBUG"を指定し、明示的にリンクするライブラリを指定し(-nodefaultlibを使用する)、/ Mオプションは必要ない。
+1うわー。マイクロソフトのツールチェーンの特質をよく知ったようになったのはどうですか? :) –
異なるバージョンのMSVCを使用している年数と年数、クロスプラットフォームプロジェクトがたくさんあるため、メイクファイルを使用していたか、IDEのビルドシステムをバイパスしていました。サードパーティ製のオープンソースライブラリを使用しています。 MSVCやSDKなどの – metamatt