web-dev-qa-db-ja.com

静的ライブラリデバッグシンボル

VS2010では、linkerの下にあるexe/dllのデバッグ情報を生成するオプションがありますが、librarianの下にあるライブラリにはそのようなオプションはありません。デバッグ情報は静的ライブラリに埋め込まれていますか?

C/C++プログラムデータベースファイル名のプロパティには、libs、exe、およびdllのオプションがあります。デフォルトでは、中間ディレクトリに移動し、libsのプロジェクト名が付けられますが、exes/dllの場合はvc $(PlatformToolsetVersion).pdbという名前になります。このオプションのpdbとは何ですか?リンカーオプションのpdbとはどう違うのですか?

ライブラリにライブラリとヘッダーを提供する場合、ライブラリのユーザーにデバッグシンボルを提供するにはどうすればよいですか?

63
David

_/ZI_または_/Zi_(_C/C++_-> General-> _Debug Information Format_)を使用すると、vc$(PlatformToolsetVersion).pdbが作成されます。作成されたすべての_.obj_ファイルのデバッグ情報が含まれます。代わりに_/Z7_を使用する場合、デバッグ情報は_.obj_ファイルに埋め込まれ、その後_.lib_に埋め込まれます。これは、おそらく静的ライブラリのデバッグ情報を配布する最も簡単な方法です。

ただし、静的ライブラリは一般にコンパイラの特定のバージョンに関連付けられているため、静的ライブラリを配布することはお勧めしません。

51
mloar

完全なハウツーが必要な人向けに、以前の回答を拡張します(VS 2013)。

これは、VS2013の問題に関するコメント^^に対処する必要があることに注意してください。

方法1:プログラムデータベース(.pdb)の方法(/ Ziまたは/ ZI)

  1. 静的ライブラリプロジェクト:静的ライブラリと同じ名前のpdbを生成します:

    • Viewメニューから_Solution Explorer_を開きます。
    • 静的ライブラリプロジェクトを右クリックし、Propertiesを選択します
    • _Configuration Properties_-> _C/C++_-> General-> _Debug Information_を_/Zi_または_/ZI_ に編集します
      • _/ZI_は、デバッグ中に「編集して続行」編集を許可することに注意してください。
    • _Configuration Properties_-> _C/C++_-> _Output Files_-> _Program Database File Name_を$(OutDir)$(TargetName).pdbに編集します
    • それをコンパイルして、YourLib.libとYourLib.pdbがどこにあるかに注意してください。
  2. アプリケーションプロジェクト:実行可能ファイルを静的ライブラリと新しいPDBファイルにリンクします

    • 繰り返しますが、プロジェクトのプロパティに移動しますが、今回は、アプリケーションプロジェクトの
    • 繰り返しますが、必要に応じて_Debug Information_プロパティを編集します。
    • _Configuration Properties_-> Linker-> General-> _Additional Library Directories_を編集し、独自の「libs」ディレクトリ、またはYourLibを保持/コピーする予定のディレクトリを追加します。 libおよびYourLib.pdbファイル。
    • _Configuration Properties_-> Linker-> Input-> _Additional Dependencies_を編集し、_YourLib.lib_(前にパスなし)を追加します
    • 次に、YourLib.libYourLib.pdbの両方を上記で指定したディレクトリにコピーします。

方法2:埋め込みシンボル(.pdbなし)方法(/ Z7)

  1. 静的ライブラリプロジェクト:デバッグシンボルが埋め込まれた静的ライブラリを生成します

    • 方法1と同様に、プロジェクトのプロパティに移動します
    • 方法1と同様に、_Debug Information_を変更しますただし今回はto _/Z7_
    • 方法1と同様に、YourLib.libが生成される場所をコンパイルしてメモします。
  2. アプリケーションプロジェクト:静的ライブラリと実行可能ファイルをリンクします

    • 方法1と同様に、プロジェクトのプロパティに移動します
    • 方法1と同様に、必要に応じて_Debug Information_プロパティを変更します
    • 方法1と同様に、_Additional Library Directories_を編集します
    • 方法1と同様に、_Additional Dependencies_を編集します
    • YourLib.libを_Additional Library Directories_で指定されたディレクトリにコピーします

ディスカッション:

  • Z7の利点?これはよりシンプルで、「シングルファイル」の方法です。すべてのデバッグ情報はlibファイルにあります。
  • Z7の欠点?ディスク上のファイルサイズ、リンク時間、「最小再構築」(/ Gm)機能との互換性なし、しない「編集と続行」を許可、古い形式(たとえば、古いパラダイム)
  • アプリケーションプロジェクトの_Debug Information_設定を指定しないのはなぜですか?この投稿は、静的ライブラリコードでデバッグを動作させる方法に関するものです。同じ「方法1対方法2」の選択は、アプリケーションプロジェクトにも適用されます。
34
bunkerdive

VS2013では、C/C++出力ファイルタブでプログラムデータベースファイル名を設定できることに気付きました。デフォルトから$(OutDir)$(TargetName).pdbなどに変更すると、問題が解決します

17
MilesDavies192

静的ライブラリは、それらを使用するプログラムに実装されます。

それらを使用するプログラムがデバッグシンボルを使用している場合、そのプログラムのコンパイル済みライブラリコードにもシンボルが含まれます。

ウィキペディアからのPDB情報:

デバッグシンボルがバイナリ自体に埋め込まれている場合、ファイルは非常に大きくなることがあります(数メガバイト)。この余分なサイズを回避するために、最新のコンパイラと初期のメインフレームデバッグシステムは、シンボリック情報を個別のファイルに出力します。 Microsoftコンパイラの場合、このファイルはPDBファイルと呼ばれます。

5
Pubby

VS2012の奇妙な動作。最初から(またはnmakeの/ Aオプションを使用して)ビルドすると、.pdbファイルが生成されます。 .libと.pdbを削除してnmakeを再実行し(もちろん/ Aなしで、リンクのみを実行します)、. pdbファイルは出力されません。

1
nothrow