web-dev-qa-db-ja.com

警告LNK4099を削除する方法:PDB 'lib.pdb'が見つかりませんでした

LNK4099警告は、静的コンパイルのリンクフェーズ中にWindows上でビルドするときに発生する可能性があります。

例えば。 nmakeとVC10を使用してビルドすると、次のようなLNK4099警告のストリームが表示されます。

libcurl_a_debug.lib(rc2_cbc.obj) : warning LNK4099: PDB 'lib.pdb' was not found with 'libcurl_a_debug.lib(rc2_cbc.obj)' or at 'C:\dev\scaler\center\dlux\lib.pdb'; linking object as if no debug info

StackOverflowは 問題の概要 を提供しますが、それを理解するために必要な詳細は提供しません。

警告を無視する または 警告を無効にする ではなく、ビルドのmakefileを修正して問題を解決したいと思います。

問題はどのように発生しますか?警告の原因を取り除くにはどうすればよいですか?

20
Donal Lafferty

根本的な問題は、警告に記載されているライブラリのデバッグシンボルファイル(.pdb)の欠落であることを理解してください。ライブラリファイルには、オブジェクトファイルベースの.pdbへの静的参照が含まれています。ライブラリが別のライブラリによって使用され、静的コンパイルが使用されると、Visual Studioはすべてのシンボルを単一の.pdbに収集し、オブジェクトファイル内の.pdb参照が更新されます。ただし、シンボルが見つからない場合、古いパスはそのまま残されます。

警告に記載されているライブラリを再コンパイルして警告を修正し、コンパイラが参照されるすべてのライブラリの.pdbにアクセスできることを確認します。これには、どの.pdbファイルが見つからないかを判断してから、.pdbが見つかるように変更を加えることが含まれます。

どのオブジェクトファイル(およびライブラリ)のシンボル(.pdb)が欠落していますか?

@ goth。pdbの参照元を説明するブログリンクを提供 が、ここに私の要約です:

ライブラリには、多数のオブジェクトファイルが含まれています。各オブジェクトファイルには、デバッグシンボルへのパスが含まれています。この情報を抽出するツールを使用できます。オブジェクトファイルとパスに基づいて、どのデバッグシンボルファイル(.pdb)が見つからなかったかを判断できます。

  1. Visual Studioコマンドプロンプトを開きます。これにより、Visual Studioツールにアクセスするために必要な環境変数を使用してコマンドシェルが作成されます。 ([スタート]メニューにある[Visual Studioツール]の下にあるはずですが、これは異なります)

  2. libツールの/listオプションを使用して、ライブラリ内のオブジェクトファイルの内部パスを取得します。例えば。

C:\dev\libcurl\win\lib>lib /list libcurl_a_debug.lib > list_of_object_files_in_library.txt

C:\dev\scaler\center\agent\thirdparty\libcurl\win\lib>more list_of_object_files_in_library.txt
Microsoft (R) Library Manager Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.

..\builds\libcurl-vc10-x86-debug-static-ssl-static-ipv6-spnego-obj-lib/file.obj
..\builds\libcurl-vc10-x86-debug-static-ssl-static-ipv6-spnego-obj-lib/timeval.obj
..\builds\libcurl-vc10-x86-debug-static-ssl-static-ipv6-spnego-obj-lib/rc2_cbc.obj

...
  1. パスを使用して、libツールの/extractオプションを使用してオブジェクトファイルを抽出します。
C:\dev\scaler\center\agent\thirdparty\libcurl\win\lib>lib /extract:..\builds\libcurl-vc10-x86-debug-static-ssl-static-ipv6-spnego-obj-lib/timeval.obj libcurl_a_debug.lib
Microsoft (R) Library Manager Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.
  1. オブジェクトファイルには、dumpbinツールを使用して抽出できる.debug$Tというデバッグセクションが含まれています。例えば。
C:\dev\scaler\center\agent\thirdparty\libcurl\win\lib>dumpbin /section:.debug$T /rawdata rc2_cbc.obj > dump_of_object_file_debug_info.txt

C:\dev\scaler\center\agent\thirdparty\libcurl\win\lib>more dump_of_object_file_debug_info.txt
Microsoft (R) COFF/PE Dumper Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file ./rc2_cbc.obj

File Type: COFF OBJECT

SECTION HEADER #9
.debug$T name
       0 physical address
       0 virtual address
      5C size of raw data
    1D53 file pointer to raw data (00001D53 to 00001DAE)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
42100040 flags
         Initialized Data
         Discardable
         1 byte align
         Read Only

RAW DATA #9
  00000000: 04 00 00 00 56 00 15 15 03 7A 47 A3 3D 4A 8C 4B  ....V....zGú=J.K
  00000010: A2 A5 26 D3 D6 57 15 46 3A 00 00 00 73 3A 5C 73  óÑ&ËÍW.F:...s:\s
  00000020: 63 61 6C 65 78 2E 6E 65 77 5C 63 65 6E 74 72 6F  caler.new\center
  00000030: 5C 6F 70 65 6E 73 73 6C 5C 62 75 69 6C 64 5C 6F  \openssl\build\o
  00000040: 70 65 6E 73 73 6C 2D 31 2E 30 2E 30 62 5C 74 6D  penssl-1.0.0b\tm
  00000050: 70 33 32 5C 6C 69 62 2E 70 64 62 00              p32\lib.pdb.

  Summary

          5C .debug$T

上記では、オブジェクトファイルがそのデバッグシンボルs:\scaler.new\center\openssl\build\openssl-1.0.0b\tmp32\lib.pdbを示していることがわかります。したがって、問題は、libcurlが使用するopensslライブラリを構築したときに生成される.pdbにあります。

警告を生成するライブラリにデバッグシンボルを追加するにはどうすればよいですか?

/ Fdオプションは、.pdbシンボルファイルの名前と場所を管理します 。例えば。 libcurlのコンパイル時に、次のフラグを使用しました。

...
!IF DEFINED(VC10)
NT_MAK_FLAGS = APP_CFLAG="/GX /GZ /MTd /Fdtmp32.dbg/app" LIB_CFLAG="/Zl /Z7 /Fdtmp32.dbg/lib"
!ENDIF
...

lib.pdbのシンボルファイル名とビルドへの相対パスは、/Fdtmp32.dbg/libで指定されます。

問題は、NT_MAK_FLAGSがopensslのコンパイル時に生成される多くのライブラリに再利用されることです。その結果、lib.pdbは最後のライブラリを除くすべてのライブラリに対して上書きされます(上書きされます)。この問題を解決するには、各ライブラリに一意の名前の.pdbを付ける必要があります。問題をさらに簡素化するには、コンパイル場所がlibcurlビルドと同じツリーにあることを確認してください。

37
Donal Lafferty

これはライブラリ.libで起こり、添付された画像が他の人を助けるかもしれません。私の場合、.libファイルと.pdbファイルが同じディレクトリにあることを確認する必要があったため、設定に$(OutDir)が表示されることに注意してください。

make sure directories are the same

古い32ビットVS2010プロジェクトをVS2013にインポートし、64ビット用にセットアップすると、それらは不整合になったと思います。

だから私はこの(良い)状況になります:

.lib and .pdb in the same directory

12
Owen Ransen