Как сделать файл.lib, когда есть файл.dll и файл заголовка
Я пытаюсь создать приложение в Visual Studio, которое сможет получить доступ к файлу.dll, который уже существует. Мне нужно приложение для вызова подпрограмм. У меня также есть заголовочный файл, который уже существует.
Я изучал Интернет и обнаружил, что мне нужно создать файл.lib. Глядя на похожие вопросы здесь, я нашел ссылку: http://support.microsoft.com/kb/131313 я не могу следовать указаниям.
Информация в ссылке говорит о создании файла DEF (я читал в другом месте, что его нужно скомпилировать как DLL с тем же именем, но не уверен, что это за имя, то же имя, что и у файла.dll?). Но я не понимаю первое направление, "использовать DUMPBIN /EXPORTS". Затем мне нужно "заглушить" функции, а затем что-то делать с файлами.OBJ (я не знаю, что это за файлы).
Есть ли какие-то пошаговые инструкции, похожие на ссылку выше, которые легко следовать?
7 ответов
Вам понадобится Microsoft Visual C++ 2010 Express (или любой другой источник инструментов командной строки MSVC) и ваша DLL.
шаги:
dumpbin /EXPORTS yourfile.dll > yourfile.exports
- Вставьте имена нужных функций из
yourfile.exports
в новыйyourfile.def
файл. Добавить строку со словомEXPORTS
в верхней части этого файла. - Запустите следующие команды из
VC\bin
каталог (тот, гдеlib.exe
и другие инструменты компиляции находятся).
vcvars32.bat
lib /def:yourfile.def /out:yourfile.lib
Вы должны получить два сгенерированных файла: yourfile.lib
а также yourfile.exp
Вы можете использовать инструмент IMPLIB от Digital Mars. Он может создать файл lib, используя только DLL, без необходимости в файле.def.
Ссылка для скачивания http://ftp.digitalmars.com/bup.zip.
Командная строка:
implib.exe /s mydll.lib mydll.dll
Есть гораздо более простой способ создать
.def
файл. Искать в Интернете
gendef utility
(возможно, он у вас уже есть, если у вас есть
Mingw-64
). Как только он у вас есть, просто перейдите в командную строку и введите,
gendef myfile.dll
И это создаст
myfile.def
. После этого просто используйте
lib.exe
создать
myfile.lib
файл, как объяснил Джон.
Вот решение с использованием Cygwin:
- установить
gendef
а такжеmingw64-x86_64-binutils
Пакеты Cygwin - запустить в консоли Cygwin:
gendef.exe awesome.dll x86_64-w64-mingw32-dlltool.exe -d awesome.def -l awesome.lib
- Вы получаете
awesome.lib
в том же реж.
Компоновщик VS 2019 прекрасно скомпонован с использованием этого файла.
Первый тип
#define YOURPROJECT_API _declspec(dllexport)
аннулировать свой ()
cpp
#include "pch.h"
#include "YOURPROJECT.H"
void yourf() {}
затем включите их
linker->input->def файл, затем наследуется от родителя или проекта по умолчанию
компилировать
У меня есть ответ. Я сделал это, когда создавал консольное приложение.exe, которому требовался файл.dll. Я тоже столкнулся с проблемой. Когда я попробовал приложение IMPLIB, оно не смогло найти никаких файлов экспорта. Вам нужно добавить#ifdef FILENAME_EXPORTS
(замените FILENAME именем вашего файла.dll) и создайте _API
. Вот код для#ifdef
команды экспорта api:
#ifdef FILENAME_EXPORTS
#define FILENAME_API __declspec(dllexport)
#else
#define FILENAME_API __declspec(dllimport)
#endif
Теперь, когда у вас определен API экспорта, вам нужно применить его ко всем функциям в файле заголовка в проекте.dll. Например:
void FILENAME_API function();
Объявите свои экспортные функции как обычно, но включите API между типом объявления и именем функции.
Для определения функции в файле.cpp в проекте.dll API в объявлении не требуется.
Вот пример имени файла.h и filename.cpp со всем кодом.
// Code for filename.h
#pragma once
// Define your Export API
#ifdef FILENAME_EXPORTS
#define FILENAME_API __declspec(dllexport)
#else
#define FILENAME_API __declspec(dllimport)
#endif
// Declare your functions with your API
void FILENAME_API function1();
void FILENAME_API function2();
void FILENAME_API function3();
-------------------------------------------------------------------------------------------
// Code for filename.cpp
#include <iostream>
#include "pch.h"
#include "filename.h"
using namespace std;
void function1()
{
cout << "Hello Function1!";
}
void function2()
{
cout << "Hello Function2!";
}
void function3()
{
cout << "Hello Function3!";
}
Теперь, когда вы скомпилируете проект, вы должны увидеть файлы.dll,.lib и.exp в папке, в которой сохраняются скомпилированные файлы. Теперь вы можете связать файл.exe с файлом.lib. Пожалуйста!
Вместо создания.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
http://msdn.microsoft.com/en-us/library/ms686923(v=vs.85).aspx