C++ 当有.dll文件和头文件时,如何生成.lib文件
我正在尝试在visual studio中创建一个应用程序,该应用程序将能够访问已经存在的.dll文件。我需要应用程序调用例程。我还有一个已经存在的头文件 我一直在互联网上研究,发现我需要创建一个.lib文件。在这里查看类似的问题,我发现了一个链接: 然而,我无法按照指示行事 链接中的信息说要生成一个DEF文件(我在别处读到,这需要编译为一个同名的DLL,但不确定该名称是什么,与.DLL文件同名?)。但我不理解第一个方向,即“使用垃圾桶/出口”。然后我需要“stubout”函数,然后处理.OBJ文件(我不知道这些文件是什么)C++ 当有.dll文件和头文件时,如何生成.lib文件,c++,dll,header,function,C++,Dll,Header,Function,我正在尝试在visual studio中创建一个应用程序,该应用程序将能够访问已经存在的.dll文件。我需要应用程序调用例程。我还有一个已经存在的头文件 我一直在互联网上研究,发现我需要创建一个.lib文件。在这里查看类似的问题,我发现了一个链接: 然而,我无法按照指示行事 链接中的信息说要生成一个DEF文件(我在别处读到,这需要编译为一个同名的DLL,但不确定该名称是什么,与.DLL文件同名?)。但我不理解第一个方向,即“使用垃圾桶/出口”。然后我需要“stubout”函数,然后处理.OBJ文
是否有类似于上述链接的分步说明易于遵循?您可以使用Digital Mars工具。它可以仅使用dll创建lib文件,而不需要.def文件 下载链接是 命令行是:
implib.exe /s mydll.lib mydll.dll
您将需要(或任何其他来源的MSVC命令行工具)和DLL
步骤:
dumpbin/EXPORTS yourfile.dll>yourfile.EXPORTS
yourfile.exports
粘贴到新的yourfile.def
文件中。在此文件顶部添加一行文字EXPORTS
VC\bin
目录(存放lib.exe
和其他编译工具的目录)运行以下命令 lib /def:yourfile.def /machine:x64 /out:yourfile64.lib
应该生成两个文件:
yourfile.lib
和yourfile.exp
,而不是创建.def,您可以通过导出应用程序代码中引用的u declspec(dllexport)在.dll文件中定义的函数/类,从.dll文件创建.lib文件
例如(伪代码)
用于创建X.dll文件的项目(例如,X是dll名称):
A.h:
A.cpp:
//函数定义
#包括
我可能有答案。我是在创建需要.dll文件的.exe控制台应用程序时这样做的。我也遇到了这个问题。当我尝试IMPLIB应用程序时,它找不到任何导出文件。您需要添加一个#ifdef FILENAME\u EXPORTS
(用.dll文件名替换文件名)并创建一个\u API
。以下是导出api命令的代码:
#ifdef FILENAME_EXPORTS
#define FILENAME_API __declspec(dllexport)
#else
#define FILENAME_API __declspec(dllimport)
#endif
现在已经定义了导出API,需要将其应用于.dll项目中头文件中的所有函数。例如:
void FILENAME_API function();
通常声明导出函数,但在declarer类型和函数名之间包含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!";
}
//filename.h的代码
#布拉格语一次
//定义导出API
#ifdef FILENAME\u导出
#定义文件名\u API\u declspec(dllexport)
#否则
#定义文件名\u API\u declspec(dllimport)
#恩迪夫
//用API声明函数
无效文件名_API函数1();
无效文件名_API函数2();
无效文件名_API函数3();
-------------------------------------------------------------------------------------------
//filename.cpp的代码
#包括
#包括“pch.h”
#包括“filename.h”
使用名称空间std;
无效函数1()
{
您想用什么编译器使用生成的库?Visual Studio?哪个版本?我的目标是使用Microsoft Visual Studio 2010作为DLL和Matlab之间的应用程序。该DLL称为Wintab32,是在您使用图形板时发现的。谢谢,我正在看一看您建议的这个IMPLIB。以下是这个链接,一个代码建议是:一个完整的C++初学者,我是如何开始执行代码的?它不是C++代码:)只需打开控制台(CMD),然后使用DLL执行EnIIb(如用KELNEL32所示)。然后将所得的.LIB文件拿到IDE的LIB文件夹中。(或添加到项目文件夹&将库路径添加到项目中)。之后,您将可以自由使用该库(只需记住保持DLL与exe的文件夹相同)。这个博客似乎解释得更好,或者你已经尝试过了吗?如果是,它是否有效?嗨,我使用了这个方法,在VS 2015中出现了一个文件错误。我不得不使用三一列的解决方案来让lib文件正常工作。我怀疑Digital Mars解决方案是否有效。VS使用PE-COFF格式,DM使用OEM格式,需要e将xtra步骤转换为VS中可用的表单,使用步骤1和2的dumpbin.exe/EXPORTS yourfile.dll,而不是Dependency Walker,同样适用于获取导出的函数名。dumpbin
对我来说失败(“链接:致命错误LNK1328:table de chaînes manquante”)因此,我使用depends并手动创建了def文件。有些库附带DLL和.h文件,但没有.lib。这就是为什么会问这个问题(以及为什么您的答案为负数)。
// Load time dynamic linking:
// Application should include X.lib (not X.dll) in the project setting
#include <A.h>
int main() {
foo();
return 0;
}
#ifdef FILENAME_EXPORTS
#define FILENAME_API __declspec(dllexport)
#else
#define FILENAME_API __declspec(dllimport)
#endif
void FILENAME_API function();
// 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!";
}