21

-g オプションを指定した g++ を使用すると、デバッグ目的で gdb を使用できます。

Visual Studio 2010 cl.exe コンパイラでこのオプションに相当するものは何ですか?

このページには、リンク用のさまざまなライブラリ (デバッグ/リリース) があります。

cl.exe でデバッグ オプションを使用してコンパイルする場合、対応するライブラリ リンク オプション (/MD/MT と /MDd/MTd) を使用する必要がありますか?

4

2 に答える 2

39

この質問にはいくつかの個別の部分があります。コンパイラ/リンカーに「デバッグ情報」(ソースコードとオブジェクトコード間のマッピング) を生成して保存するように指示する方法、デバッグを容易にするためにコードを別の方法でコンパイルするようにコンパイラに指示する方法 ( assert() と #ifdef _DEBUG) を考えて、プロジェクトにリンクするプリコンパイル済みライブラリにデバッグ情報が含まれているかどうかを確認してください。

-Zi (CL コンパイラにデバッグ情報を生成するように指示するフラグ) は、gcc の -g フラグと同等です。

(-Z オプションには他の形式もあります。Visual Studio IDE で「編集して続行」をサポートする場合は -ZI ですが、IDE を使用している場合は、おそらく代わりにコンパイラ設定へのインターフェイスを使用しています。それらを直接操作し、古い CodeView 形式のデバッグ情報が必要な場合は -Z7 (CL を直接呼び出すときは常に -Zi が必要でした)。

-Zi (または -ZI) オプションを使用すると、通常はディレクトリごとに .pdb ファイルが生成されることに注意してください。これらの個別の .pdb ファイルを、リンクしたコードを表すマスター ファイルに結合します。これが、リンカーの -debug スイッチの目的です。

また、これは直感に反するように聞こえるかもしれませんが、常に -Zi (CL の場合) と -debug (link.exe の場合) を使用してください。リリースするコードについても。デバッグ情報は別の .pdb ファイル (顧客には出荷しません) に保存されるため、実行可能ファイルのサイズが大きくなったり、秘密が顧客に渡ったりすることはありません。デバッグが必要になる可能性がある場合は、.pdb が必要になります。(-ZI はありますが、-Zi は最適化と互換性がありません。そのため、「デバッグ」ビルドを -ZI でコンパイルし、「リリース」ビルドを「-Zi -O2」でコンパイルすることをお勧めします。)

ライブラリに関しては、C ランタイム ライブラリのデバッグ/リリース プロパティを、コードにデバッグ情報が含まれているかどうかと厳密に一致させる必要はありませんが、必要なプロジェクトをデバッグする場合は、通常は良い考えです。すべてをデバッグできるようにするためです。デバッグしない場合は、余分な重みは必要ありません。特定のライブラリのデバッグ/リリース バージョンを使用しても、デバッグ シンボルが利用可能かどうかには影響しませんが (ライブラリをコンパイルした人が前の段落で述べた点を理解していれば)、assert や余分な #ifdef _DEBUG などに影響します。そのライブラリのコード。

これは、リンクするすべてのライブラリに当てはまりますが、特に C ランタイム ライブラリの場合 -- Microsoft は、malloc() と free() に追加のエラー検出コードを追加しました。したがって、プロジェクト内で CRT ライブラリのデバッグ フレーバーを使用しているものがある場合は、すべて使用する必要があります。

/M オプション (/MTd および /MDd) は奇妙で魔法のようなものです。私の意見では、これらは舞台裏で行われている複雑な一連の他の処理のエイリアスにすぎません。たとえば、「_DEBUG、_MT、および _DLL を定義し、アプリケーションでランタイム ライブラリのデバッグ マルチスレッドおよび DLL 固有のバージョンを使用する」に記載されている /MDd を取り上げます。これにより、コンパイラはライブラリ名 MSVCRTD を配置します。 lib を .obj ファイルに入れます。」ここでは、プリプロセッサ (_DEBUG およびその他のプリプロセッサ シンボルの定義) とリンカー (実際にはソース コードに #pragma コメント (リンカー) を配置します) の両方に影響を与えています。何が起こっているのかを気にしていて理解していない場合、これは実際の問題を引き起こす可能性があります.IDEを使用しない多くのプロジェクトがmsvcrt.libとmsvcrtd.libの両方に関する警告で行き詰まるのを見てきました.絡み合って、これら (/M オプション) を安全に使用する方法を理解するまでには、それらはもう必要ありません。私は物事を明示的にすることを好みます: "-D _DEBUG" を必要な場所に直接指定し、明示的にリンクするライブラリを指定 (および -nodefaultlib を使用) すると、/M オプションは不要になります。

于 2011-01-11T20:35:20.177 に答える
7

デバッグ情報生成オプション( /Z7/Ziまたは)のいずれかを探しています/ZI

これらのいずれかを使用する場合は、/DEBUGオプションもリンカーに渡す必要があります。

また、ランタイム ライブラリ (または) のデバッグ バージョンに対してリンクする必要があります。これらのバージョンは対応するリリースとは異なるため、これは重要です (たとえば、メモリ割り当てルーチンに互換性がありません)。/MDd/MTd

于 2011-01-11T16:29:12.387 に答える