Как сделать файл .lib, если есть файл .dll и файл заголовка - PullRequest
40 голосов
/ 20 февраля 2012

Я пытаюсь создать приложение в Visual Studio, которое сможет получить доступ к файлу .dll, который уже существует.Мне нужно приложение для вызова подпрограмм.У меня также есть файл заголовка, который уже существует.

Я исследовал Интернет и обнаружил, что мне нужно создать файл .lib.Глядя на похожие вопросы здесь, я нашел ссылку: http://support.microsoft.com/kb/131313 Я не могу, однако, следовать указаниям.

Информация в ссылке говорит, чтобы сделать файл DEF (я читал в другом месте, что это должно бытьскомпилирован как DLL с тем же именем, но не уверен, что это имя, то же имя, что и файл .dll?).Но я не понимаю первое направление, «использовать DUMPBIN / EXPORTS».Затем мне нужно «заглушить» функции, а затем что-то делать с файлами .OBJ (я не знаю, что это за файлы).

Есть ли пошаговые инструкции, похожие на ссылкувыше, что легко следовать?

Ответы [ 3 ]

56 голосов
/ 21 апреля 2013

Вам понадобится Microsoft Visual C ++ 2010 Express (или любой другой источник инструментов командной строки MSVC) и ваша DLL.

Шаги:

  1. dumpbin /EXPORTS yourfile.dll > yourfile.exports
  2. Вставьте имена необходимых функций из yourfile.exports в новый файл yourfile.def. Добавьте строку со словом EXPORTS вверху этого файла.
  3. Запустите следующие команды из каталога VC\bin (в котором находятся lib.exe и другие инструменты компиляции).

 vcvars32.bat

 lib /def:yourfile.def /out:yourfile.lib

или для сборок x64

 lib /def:yourfile.def /machine:x64 /out:yourfile64.lib

Вы должны получить два сгенерированных файла: yourfile.lib и yourfile.exp

16 голосов
/ 20 февраля 2012

Вы можете использовать инструмент Digital Mars's IMPLIB . Он может создать файл lib, используя только dll, без необходимости использования файла .def.

Ссылка для скачивания http://ftp.digitalmars.com/bup.zip.

Командная строка:

implib.exe /s mydll.lib mydll.dll
0 голосов
/ 03 сентября 2013

Вместо создания .def вы можете создать файл .lib из файла .dll, экспортировав функции / классы, определенные в файле .dll, с помощью __declspec (dllexport), которые были указаны в коде приложения.

Например (псевдокод)

ПРОЕКТ для создания файла X.dll (скажем, X - это имя DLL):

хиджра:

// Function declaration
__declspec(dllexport) void  foo(void);

a.cpp:

// Function definition 
#include <A.h>
void foo(void) {
; // definition
}

Если вы создаете вышеупомянутый проект dll в Visual Studio, то компилятор сгенерирует X.dll , а также X.lib [с экспортированной функцией foo __declspec (dllexport)].

App.cpp:

// Load time dynamic linking:
// Application should include X.lib (not X.dll) in the project setting
 #include <A.h>
 int main() {
 foo();
 return 0;
}

Для дальнейшего изучения, пожалуйста, используйте следующие ссылки для лучшего понимания:

http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL#CppMatureApproach

http://msdn.microsoft.com/en-us/library/ms686923(v=vs.85).aspx

...