windows - visual - Cómo eliminar la advertencia LNK4099: PDB ''lib.pdb'' no se encontró
source information is missing from the debug information for this module (2)
Comprenda que el problema subyacente es un archivo de símbolos de depuración faltante (.pdb) para la biblioteca mencionada en la advertencia. Los archivos de biblioteca contienen una referencia estática a .pdb en base a un archivo objeto. Cuando una biblioteca es utilizada por otra biblioteca y se usa la compilación estática, Visual Studio recopila todos los símbolos en un solo .pdb y se actualizan las referencias .pdb en los archivos de objetos. Sin embargo, si no puede encontrar los símbolos, dejará el antiguo camino en su lugar.
Repare la advertencia al volver a compilar la biblioteca mencionada en las advertencias y asegúrese de que el compilador tenga acceso al .pdb de cada biblioteca referenciada. Esto implica determinar qué archivo .pdb no se puede encontrar y luego hacer cambios para garantizar que se pueda encontrar el .pdb.
¿A qué archivo de objeto (y, por lo tanto, a la biblioteca) nos faltan los símbolos (.pdb)?
@goth proporcionó un enlace de blog que explica de dónde proviene la referencia .pdb , pero aquí está mi resumen:
Una biblioteca contiene una serie de archivos de objetos. Cada archivo de objeto incluye una ruta a los símbolos de depuración. Podemos utilizar herramientas para extraer esta información. Según el archivo de objeto y la ruta, podemos averiguar qué archivo de símbolos de depuración (.pdb) no se pudo encontrar.
Abra el símbolo del sistema de Visual Studio. Esto crea un shell de comandos con las variables de entorno necesarias para acceder a las herramientas de Visual Studio. (Debería estar bajo "Visual Studio Tools" enterrado en el Menú de Inicio, pero esto varía)
Obtenga la ruta interna del archivo objeto en la biblioteca usando la opción
/list
la herramientalib
. P.ej
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
...
- Usando la ruta, extraiga el archivo objeto usando la opción
/extract
la herramientalib
.
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.
- El archivo de objeto contiene una sección de depuración llamada
.debug$T
que podemos extraer usando la herramientadumpbin
. P.ej
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
Arriba, ve que el archivo objeto dice sus símbolos de depuración s:/scaler.new/center/openssl/build/openssl-1.0.0b/tmp32/lib.pdb
. Por lo tanto, el problema radica en el .pdb generado cuando construimos la biblioteca openssl utilizada por libcurl.
¿Cómo agrego los símbolos de depuración a la biblioteca que genera la advertencia?
La opción / Fd gobierna el nombre y la ubicación del archivo de símbolos .pdb . Por ejemplo, al compilar libcurl, usé las siguientes banderas:
...
!IF DEFINED(VC10)
NT_MAK_FLAGS = APP_CFLAG="/GX /GZ /MTd /Fdtmp32.dbg/app" LIB_CFLAG="/Zl /Z7 /Fdtmp32.dbg/lib"
!ENDIF
...
El nombre del archivo de lib.pdb
de lib.pdb
y su ruta relativa a la compilación viene dado por /Fdtmp32.dbg/lib
.
El problema es que el NT_MAK_FLAGS
se reutiliza para una serie de bibliotecas que se generan cuando se compila openssl. Como resultado, lib.pdb
es lib.pdb
(sobrescrito) para todos menos la última biblioteca. Para resolver el problema, a cada biblioteca se le debe dar .pdb con un nombre único. Para simplificar aún más las cosas, asegúrese de que la ubicación de la compilación esté en el mismo árbol que la compilación de libcurl
.
Las advertencias de LNK4099 pueden ocurrir al construir en Windows durante la fase de enlace de una compilación estática.
Por ejemplo, cuando se construye usando nmake y VC10, recibo un flujo de advertencias LNK4099 como
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 ofrece una buena visión general del problema , pero no los detalles necesarios para entenderlo.
En lugar de ignorar la advertencia o deshabilitar la advertencia , me gustaría arreglar los makefiles en mi compilación para eliminar el problema.
¿Cómo surge el problema? ¿Cómo elimino la causa de las advertencias?
Esto me sucedió con una biblioteca .lib y tal vez la imagen adjunta ayude a otros. En mi caso, tenía que asegurarme de que el archivo .lib y el archivo .pdb estuvieran en el mismo directorio, así que tenga en cuenta cómo aparece $ (OutDir) en la configuración.
Creo que se desalinearon cuando importé un viejo proyecto VS2010 de 32 bits a VS2013 y lo configuré para 64 bits.
Así que termino con esta (buena) situación: