Инструменты для проверки .lib файлов?

Я оцениваю некоторое недооцененное программное обеспечение. Когда я создаю образец проекта, я получаю ошибку компоновщика, которая выглядит так:

error LNK2019: unresolved external symbol

В этом приложении не так много файлов lib, поэтому я могу решить эту проблему с помощью проб и ошибок, но я знаю, что для решения этой проблемы требуется более элегантный.

В java-мире я бы нашел grep FOO *.jar, чтобы найти банку, и я ищу аналог С++. Я работаю с кодом С++ в Visual Studio 2005.

Я подозреваю, что утилита lib.exe с параметром /LIST может получить информацию, но до сих пор я не увенчалась успехом. Он просто печатает это:

Microsoft (R) Library Manager Version 8.00.50727.762
Copyright (C) Microsoft Corporation.  All rights reserved.

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

Любые предложения?

Ответ 1

Прежде всего, вам нужно знать, какой тип библиотеки вы ищете. Некоторые библиотеки просто содержат ссылки для DLL (то есть библиотеки импорта), а другие - это объекты кода, которые становятся частью исполняемого образа (то есть статические библиотеки). Из внешнего вида этого вывода вы искали библиотеку импорта DLL.

Затем вы хотите использовать правильный инструмент. Lib.exe используется для извлечения объектных файлов из библиотек, а что - нет. Это почти то же самое, что и утилита jar для Java. Microsoft предоставляет dumpbin.exe, который будет выгружать информацию из библиотеки. Я вижу, что LarryF уже упоминал об этом.

Для библиотек импорта запустите dumpbin.exe -headers foo.lib и перенаправьте его в выходной файл. Результат будет содержать фрагменты для каждого символа, которые экспортирует связанная DLL. Найдите строки, начинающиеся с " Symbol name :". Обратите внимание, что есть два пробела до и после "Имя символа", если вы хотите получить точное совпадение. Вы также можете запустить вывод через findstr, чтобы сгенерировать список символов и перенаправить его в текстовый файл, если вам нужно что-то приятнее посмотреть:

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

Другой вариант - открыть связанную DLL с помощью depends.exe.

Ответ 2

Более чем одна вещь может быть вашей проблемой здесь. Я не уверен, что поиск в файле lib будет лучшим способом его решить, IMHO... Однако DUMPBIN.exe, вероятно, является инструментом, который вы ищете. Используйте его из командной строки, но убедитесь, что ваши пути установлены, или используйте "Командная строка Visual Studio", которую VS устанавливает для вас в вашем стартовом меню VS.

Ответ 3

Если у вас есть DLL и вы хотите использовать его в своем коде с помощью __declspec(dllimport), вы можете легко создать требуемый файл LIB, если у вас есть файл DEF для DLL:

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

который создает mydll.lib

Эта команда должна выполняться в командной строке Visual Studio SDK.

Файл DEF можно записать вручную очень просто, если у вас его нет: Вы открываете DLL в DependencyWalker (http://www.dependencywalker.com), выберите "Сохранить как" → "Текст с листами импорта/экспорта" и имена и ординалы всех экспортированных функций в txt файле, например:

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

Остальное быстро делается. Создайте файл DEF, который имеет этот формат:

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

Число за символом @является порядковым номером.


P.D: DependencyWalker может даже undecorate криптографические имена экспорта С++, например

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

Ответ 4

это работало с визуальным С++ express 9.lib:

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

или dumpbin.exe -headers clangParse.lib | findstr/c: "sym =" > clangParse-exports.txt

спасибо d.shawley

Ответ 5

открыть командную строку Visual Studio

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