C++ 当有.dll文件和头文件时,如何生成.lib文件

C++ 当有.dll文件和头文件时,如何生成.lib文件,c++,dll,header,function,C++,Dll,Header,Function,我正在尝试在visual studio中创建一个应用程序,该应用程序将能够访问已经存在的.dll文件。我需要应用程序调用例程。我还有一个已经存在的头文件 我一直在互联网上研究,发现我需要创建一个.lib文件。在这里查看类似的问题,我发现了一个链接: 然而,我无法按照指示行事 链接中的信息说要生成一个DEF文件(我在别处读到,这需要编译为一个同名的DLL,但不确定该名称是什么,与.DLL文件同名?)。但我不理解第一个方向,即“使用垃圾桶/出口”。然后我需要“stubout”函数,然后处理.OBJ文

我正在尝试在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
    和其他编译工具的目录)运行以下命令
  • 或用于x64版本

     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!";
    }