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

时间:2012-02-20 11:20:07

标签: c++ dll header function

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

我一直在网上研究,发现我需要创建一个.lib文件。在这里查看类似的问题,我找到了一个链接:http://support.microsoft.com/kb/131313 但我不能按照指示行事。

链接中的信息表示要创建一个DEF文件(我在别处读到这需要编译为具有相同名称的DLL,但不确定该名称是什么,与.dll文件同名?) 。但我不明白第一个方向,即“使用DUMPBIN / EXPORTS”。然后我需要'存根'函数,然后与.OBJ文件有关(我不知道这些文件是什么)。

是否有类似于上述链接的分步说明,这些说明很容易理解?

5 个答案:

答案 0 :(得分:54)

您将需要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和其他编译工具所在的目录)运行以下命令。
  4.  vcvars32.bat
    
     lib /def:yourfile.def /out:yourfile.lib
    

    或x64版本

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

    您应该会生成两个文件:yourfile.libyourfile.exp

答案 1 :(得分:16)

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

下载链接为http://ftp.digitalmars.com/bup.zip

命令行是:

implib.exe /s mydll.lib mydll.dll

答案 2 :(得分:0)

Ещеодинвариант,спомощьюpowershell,dumpbin和lib。
Взятоотсюдаидоработано: http://xbb.uz/dev/Gjenjeracija-.lib-iz-DLL-s-pomoshhju-Visual-Studio

$pattern = "\s+([A-Z0-9]+)\s+[A-Z0-9]+\s+[A-Z0-9]{8} (.*)";
$platform = "x86";

if($args.length)
{
    if($args[1])
    {
        $platform = $args[1];
    }

    $dll = [System.IO.Path]::GetFilename($args[0]);
    $def = [System.IO.Path]::ChangeExtension($dll, "def");
    $lib = [System.IO.Path]::ChangeExtension($dll, "lib");

    Write-Host ("Generating " + $def + " file…");
    $content="EXPORTS`n";
    &"dumpbin" "/exports" $args[0] | select-string $pattern | %{$null = $_.Line -match $pattern; $str='{0,9}{1,-30} @{2}' -f " ", $matches[2], $matches[1]; $content+=($str+"`n"); }
    $content | Out-File $def -Encoding Ascii;

    Write-Host ("Generating " + $lib + " file…");
    &"lib" ("/def:" + $def) ("/out:" + $lib) ("/machine:" + $platform) | out-null;

    Write-Host ("");
}
else
{
    Write-Host "Start powershell from VisualStudio commandline then use this script.";
    Write-Host "Script takes two parameters: dll filename and platform.";
    Write-Host "example: .\GenerateLibFromDll.ps1 hello.dll `"x64`"";
    Write-Host "or to process all dlls in the dir: gci *.dll | foreach {&`".\GenerateLibFromDll.ps1`" $_.Name `"x64`"}";;
}

答案 3 :(得分:-1)

我可能有答案。我在创建需要.dll文件的.exe控制台应用程序时执行了此操作。我也遇到了这个问题。当我尝试IMPLIB应用程序时,找不到任何导出文件。您需要添加#ifdef FILENAME_EXPORTS(用.dll文件名替换FILENAME)并创建一个_API。以下是#ifdef导出api命令的代码:

#ifdef FILENAME_EXPORTS
#define FILENAME_API __declspec(dllexport)
#else
#define FILENAME_API __declspec(dllimport)
#endif

现在,您已经定义了Export 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文件链接。不客气!

答案 4 :(得分:-3)

您可以通过导出由._llclspec(dllexport)在.dll文件中定义的函数/类而不是创建.def来创建.dib文件,该文件在应用程序代码中被引用。

例如(伪代码)

PROJECT用于创建X.dll文件(例如,X是dll名称):

A.H:

// Function declaration
__declspec(dllexport) void  foo(void);

A.cpp:

// Function definition 
#include <A.h>
void foo(void) {
; // definition
}

如果在Visual Studio中构建上述dll项目,则编译器将生成 X.dll 以及 X.lib [已导出函数 foo < / strong> by __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#CppMatureApproach

http://msdn.microsoft.com/en-us/library/ms686923(v=vs.85).aspx