Инструменты для проверки файлов .lib? - PullRequest
70 голосов
/ 28 января 2009

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

error LNK2019: unresolved external symbol

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

В мире Java я бы grep FOO * .jar нашел банку, и я ищу аналог C ++. Я работаю с кодом C ++ в 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
...

Есть предложения?

Ответы [ 5 ]

87 голосов
/ 28 января 2009

Прежде всего вам нужно знать, на какую библиотеку вы смотрите. Некоторые библиотеки просто содержат связи для 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.

16 голосов
/ 28 января 2009

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

11 голосов
/ 13 декабря 2013

Если у вас есть 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),, выбираете «Сохранить как» -> «Текст со списками импорта / экспорта» и получаете имена и порядковые номера всех экспортируемых функций в текстовом файле, например:

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 может даже отменить декорацию загадочных имен экспорта C ++, таких как

Foo@@YGHHH@Z   -->   int Foo(int, int). 
8 голосов
/ 12 февраля 2013

это работало с визуальным C ++ 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

спасибо, д.Шоули

2 голосов
/ 28 апреля 2016

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...