Как сделать файл.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.

шаги:

  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

Вы должны получить два сгенерированных файла: 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

Другие вопросы по тегам