Herramientas para inspeccionar archivos .lib?

Estoy evaluando un poco de software subdocumentado. Cuando construyo un proyecto de muestra, aparece un error del enlazador que se ve así:

  error LNK2019: símbolo externo no resuelto 

No hay una gran cantidad de archivos lib con esta aplicación, por lo que puedo resolver este problema con prueba y error, pero sé que hay una manera más elegante es resolver este problema.

En el mundo java, me gustaría grep FOO * .jar para encontrar el tarro y estoy buscando el análogo de C ++. Estoy trabajando con código C ++ en Visual Studio 2005.

Sospecho que la utilidad lib.exe con la opción / LIST puede obtener la información, pero hasta ahora no he tenido éxito. Simplemente imprime esto:

 Microsoft (R) Library Manager Versión 8.00.50727.762
 Copyright (C) Microsoft Corporation.  Todos los derechos reservados.

 granite50.dll
 granite50.dll
 granite50.dll
 granite50.dll
 ...

¿Alguna sugerencia?

En primer lugar, debe saber qué tipo de biblioteca está buscando. Algunas bibliotecas simplemente contienen enlaces para una DLL (es decir, bibliotecas de importación) y otras son objetos de código que se vuelven parte de la imagen ejecutable (es decir, bibliotecas estáticas). Desde el aspecto de esa salida, estabas mirando una biblioteca de importación de DLL.

Luego, quiere usar la herramienta correcta. Lib.exe se usa para extraer archivos de objetos de bibliotecas y otras cosas. Esto es más o menos lo mismo que la utilidad jar para Java. Microsoft proporciona dumpbin.exe que arrojará información de la biblioteca. Veo que LarryF ya lo mencionó.

Para bibliotecas de importación, ejecute dumpbin.exe -headers foo.lib y redirigirlo a un archivo de salida. El resultado contendrá fragmentos para cada símbolo que exporta el archivo DLL relacionado. Busque las líneas que comienzan con " Symbol name :" . Tenga en cuenta que hay dos espacios antes y después de “Nombre del símbolo” si desea una coincidencia exacta. También puede ejecutar el resultado a través de findstr para generar una lista de símbolos y redirigirlos a un archivo de texto si desea ver algo un poco mejor:

 dumpbin.exe -headers foo.lib | findstr /c:" Symbol name :" > foo-exports.txt 

La otra opción es abrir la DLL relacionada con depends.exe .

Más de una cosa puede ser tu problema aquí. No estoy seguro de que mirar el archivo lib sea la mejor manera de resolverlo, en mi humilde opinión … Sin embargo, DUMPBIN.exe es probablemente la herramienta que está buscando. Úselo desde la línea de comandos, pero asegúrese de que sus rutas estén establecidas, o use el “Símbolo del sistema de Visual Studio” que VS instala para usted en su menú de inicio de VS.

Si tiene una DLL y desea usarla en su código con __declspec(dllimport) , puede crear fácilmente el archivo LIB requerido si tiene un archivo DEF para la DLL:

 lib /def:mydll.def /nologo /machine:x86 

que crea mydll.lib

Este comando debe ejecutarse en el símbolo del sistema de Visual Studio SDK.

Un archivo DEF puede escribirse manualmente de forma extremadamente fácil si no tiene uno: abre la DLL en DependencyWalker ( http://www.dependencywalker.com ), selecciona “Guardar como” -> “Texto con listas de importación / exportación” y tienen los nombres y ordinales de todas las funciones exportadas en un archivo txt como este:

 Export Ordinal Hint Function Entry Point ------ ----------- ----------- -------------------------------- ----------- [C ] 2 (0x0002) 1 (0x0001) gsasl_base64_from 0x000024F0 [C ] 3 (0x0003) 2 (0x0002) gsasl_base64_to 0x000024A0 [C ] 4 (0x0004) 3 (0x0003) gsasl_callback 0x000018B0 [C ] 5 (0x0005) 4 (0x0004) gsasl_callback_hook_get 0x00001900 [C ] 6 (0x0006) 5 (0x0005) gsasl_callback_hook_set 0x000018F0 [C ] 7 (0x0007) 6 (0x0006) gsasl_callback_set 0x000018A0 [C ] 8 (0x0008) 7 (0x0007) gsasl_check_version 0x00001870 [C ] 9 (0x0009) 8 (0x0008) gsasl_client_mechlist 0x00001E20 [C ] 10 (0x000A) 9 (0x0009) gsasl_client_start 0x00001F40 

El rest se hace rápidamente. Crea un archivo DEF que tenga este formato:

 EXPORTS gsasl_base64_from @2 gsasl_base64_to @3 gsasl_callback @4 gsasl_callback_hook_get @5 gsasl_callback_hook_set @6 gsasl_callback_set @7 gsasl_check_version @8 gsasl_client_mechlist @9 gsasl_client_start @10 gsasl_client_suggest_mechanism @11 

El número detrás de @ es el ordinal.


PD: DependencyWalker incluso puede decodificar nombres crípticos de las exportaciones de C ++ como

 Foo@@YGHHH@Z --> int Foo(int, int). 

esto funcionó con una visual C ++ express 9 .lib:

dumpbin.exe -headers clangParse.lib | findstr / c: “COMDAT”> clangParse-exports.txt

o dumpbin.exe -headers clangParse.lib | findstr / c: “sym =”> clangParse-exports.txt

gracias d.shawley

abrir símbolo del sistema de Visual Studio

dumpbin / all Effects11.lib> D: \ 1.txt