当有.dll文件和头文件时如何制作.lib文件

问题描述 投票:0回答:6

我正在尝试在 Visual Studio 中创建一个应用程序,该应用程序将能够访问已存在的 .dll 文件。我需要应用程序来调用例程。我还有一个已经存在的头文件。

我一直在互联网上进行研究,发现我需要创建一个 .lib 文件。在这里查看类似的问题,我找到了一个链接:http://support.microsoft.com/kb/131313 然而我无法遵循指示。

链接中的信息说要制作一个DEF文件(我在其他地方读到这需要编译为同名的DLL,但不确定该名称是什么,与.dll文件同名吗?)。但我不明白第一个方向,即“使用 DUMPBIN /EXPORTS”。然后我需要“存根”函数,然后处理 .OBJ 文件(我不知道这些文件是什么)。

是否有任何类似于上面的链接且易于遵循的分步说明?

c++ dll header function
6个回答
96
投票

您将需要 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

或用于 x64 版本

 lib /def:yourfile.def /machine:x64 /out:yourfile64.lib

您应该生成两个文件:

yourfile.lib
yourfile.exp


23
投票

您可以使用 Digital Mars 的 IMPLIB 工具。它可以仅使用 dll 创建 lib 文件,而不需要 .def 文件。

您可以在https://ftp.digitalmars.com/bup.zip下载。

命令行是:

implib.exe /s mydll.lib mydll.dll

4
投票

有一种更简单的方法来创建

.def
文件。在网络上搜索
gendef utility
(如果您有
Mingw-64
,您可能已经拥有它)。一旦你有了它,只需进入命令行并输入,

gendef myfile.dll

它将创建一个

myfile.def
。之后,只需使用
lib.exe
创建
myfile.lib
文件,如 John 所解释的。


2
投票

这是使用 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 链接器使用此文件链接得很好。


0
投票

第一种

#define YOURPROJECT_API _declspec(dllexport)

void yourf()

cpp

#include "pch.h"
#include "YOURPROJECT.H"
void yourf() {}

然后包括它们

链接器->输入->def 文件然后从父级或项目默认继承

编译


-1
投票

我也许有答案。当我创建需要 .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 文件链接。不客气!

© www.soinside.com 2019 - 2024. All rights reserved.