Как удалить предупреждение 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:devscalercenterdluxlib.pdb'; linking object as if no debug info

StackOverflow дает хороший обзор проблемы, но не детали, необходимые для его понимания.

, а не игнорируем предупреждение или отключить предупреждение, Я хотел бы исправить makefiles в моем сборка для устранения проблемы.

Как возникает проблема? Как удалить причину предупреждений?

2 ответов


поймите, что основной проблемой является отсутствие файла символов отладки (.pdb) для библиотеки, упомянутой в предупреждении. Файлы библиотеки содержат статическую ссылку на.pdb на основе объектного файла. Когда библиотека используется другой библиотекой и используется статическая компиляция, Visual Studio собирает все символы в один .pdb и the .ссылки pdb в объектных файлах обновляются. Однако, если он не может найти символы, он оставит старый путь на месте.

исправьте предупреждение путем перекомпиляции библиотеки, упомянутой в предупреждениях, и убедитесь, что компилятор имеет доступ к .pdb каждой ссылочной библиотеки. Это включает в себя определение того, что .pdb-файл не может быть найден, а затем внести изменения, чтобы обеспечить .pdb можно найти.

в каком объектном файле (и, следовательно, библиотеке) отсутствуют символы (.ПДБ) для?

@goth дал ссылку объясняя блог, где .распределительная плата ссылка, но вот мое резюме:

библиотека содержит ряд объектных файлов. Каждый объектный файл содержит путь к символам отладки. Мы можем использовать инструменты для извлечения этой информации. На основе объектного файла и пути мы можем выяснить, какой файл символов отладки (.pdb) не удалось найти.

  1. Откройте командную строку Visual Studio. Это создает командную оболочку с переменными среды, необходимыми для доступа к средствам Visual Studio. (Должно быть под "Visual Studio Tools" похоронен в меню "Пуск", но это зависит)

  2. получить внутренний путь к объектному файлу в библиотеке с помощью lib инструмент!-Вариант -5-->. Е. Г.

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 инструмент!-Вариант -7-->.
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. объектный файл содержит раздел отладки с именем .debug$T что мы можем извлечь с помощью the . Е. Г.
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. Поэтому проблема заключается в том .pdb, созданный при создании библиотеки openssl, используемой libcurl.

как добавить символы отладки в библиотеку, генерирующую предупреждение?

на /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 является clobbered (перезаписан) для всех, кроме последней библиотеки. Для решения проблемы необходимо предоставить каждую библиотеку .pdb-файл с уникальным именем. Для дальнейшего упрощения вопросов необходимо обеспечить, чтобы компиляция расположение находится в том же дереве, что и libcurl построить.


Это случилось со мной с библиотекой .lib и, возможно, прикрепленное изображение поможет другим. В моем случае я должен был убедиться, что это так .lib и .pdb-файл был в том же каталоге, поэтому обратите внимание, как $(OutDir) отображается в настройках.

make sure directories are the same

Я думаю, что они были смещены, когда я импортировал старый 32-битный проект VS2010 в VS2013 и настроил его на 64 бита.

Так что я в конечном итоге с этим (хорошим) ситуация:

.lib and .pdb in the same directory