我正在尝试在 Visual Studio 中创建一个应用程序,该应用程序将能够访问已存在的 .dll 文件。我需要应用程序来调用例程。我还有一个已经存在的头文件。
我一直在互联网上进行研究,发现我需要创建一个 .lib 文件。在这里查看类似的问题,我找到了一个链接:http://support.microsoft.com/kb/131313 然而我无法遵循指示。
链接中的信息说要制作一个DEF文件(我在其他地方读到这需要编译为同名的DLL,但不确定该名称是什么,与.dll文件同名吗?)。但我不明白第一个方向,即“使用 DUMPBIN /EXPORTS”。然后我需要“存根”函数,然后处理 .OBJ 文件(我不知道这些文件是什么)。
是否有任何类似于上面的链接且易于遵循的分步说明?
您将需要 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
或用于 x64 版本
lib /def:yourfile.def /machine:x64 /out:yourfile64.lib
您应该生成两个文件:
yourfile.lib
和yourfile.exp
您可以使用 Digital Mars 的 IMPLIB 工具。它可以仅使用 dll 创建 lib 文件,而不需要 .def 文件。
您可以在https://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
文件,如 John 所解释的。
这是使用 Cygwin 的解决方案:
gendef
和 mingw64-x86_64-binutils
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)
void yourf()
cpp
#include "pch.h"
#include "YOURPROJECT.H"
void yourf() {}
然后包括它们
链接器->输入->def 文件然后从父级或项目默认继承
编译
我也许有答案。当我创建需要 .dll 文件的 .exe 控制台应用程序时,我这样做了。我也遇到了这个问题。当我尝试 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。
如果要在.dll项目中的.cpp文件中定义函数,则不需要声明中的API。
这是 filename.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 文件链接。不客气!