2009-01-28 18 views
67

Estoy evaluando algunos software poco documentados. Cuando construyo un proyecto de ejemplo, estoy recibiendo un error de vinculador que se parece a:Herramientas para inspeccionar archivos .lib?

error LNK2019: unresolved external symbol

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

En el mundo java, me gustaría grep FOO * .jar para encontrar el jar y estoy buscando el análogo 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 Version 8.00.50727.762 
Copyright (C) Microsoft Corporation. All rights reserved. 

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

¿Alguna sugerencia?

Respuesta

81

Antes que nada, necesita 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.

A continuación, desea utilizar la herramienta adecuada. 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 a traves de findstr para generar una lista de símbolos y redirigir que en un archivo de texto si quieres algo un poco más agradable para mirar:

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

La otra opción es abrir el archivo DLL relacionados con depends.exe .

+0

Para cualquier persona que tenga problemas para ejecutar '' dumpbin.exe' de Powershell' - https://stackoverflow.com/questions/477387/cannot-find-dumpbin-exe/38616596#38616596 – Ralt

15

Más de una cosa puede ser su 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.

+0

Gracias por el puntero a DUMPBIN. Hice dumpbin/all some.lib> some.dump luego grep'd a través de mis archivos de volcado y encontré la biblioteca que necesitaba para vincular. – criddell

+2

1 para "Visual Studio Símbolo del sistema" referencia – Steed

8

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

10

Si usted tiene un archivo DLL y desea utilizarlo en su código con __declspec(dllimport) puede crear el archivo de biblioteca deseado fácilmente si tiene un archivo DEF para el DLL:

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

que crea mydll. lib

Este comando se debe ejecutar en el Visual Studio SDK.

Un archivo DEF se puede escribir manualmente extremadamente fácil si usted no tiene uno: Se abre el archivo DLL en DependencyWalker (http://www.dependencywalker.com), selecciona "Guardar como" - "Texto listas Importar/Exportar"> y tienen los nombres y ordinales de todas las funciones exportadas en un archivo txt como esto:

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 resto se hace rápidamente. Cree un archivo DEF que tiene 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 la @ es el ordinal.


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

Estudio Comando
[email protected]@[email protected] --> int Foo(int, int). 
2

abierta en Visual

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

Cuestiones relacionadas