我正在尝试在visual studio中创建一个能够访问已存在的.dll文件的应用程序。我需要应用程序来调用例程。我还有一个已经存在的头文件。
我一直在网上研究,发现我需要创建一个.lib文件。在这里查看类似的问题,我找到了一个链接:http://support.microsoft.com/kb/131313 但我不能按照指示行事。
链接中的信息表示要创建一个DEF文件(我在别处读到这需要编译为具有相同名称的DLL,但不确定该名称是什么,与.dll文件同名?) 。但我不明白第一个方向,即“使用DUMPBIN / EXPORTS”。然后我需要'存根'函数,然后与.OBJ文件有关(我不知道这些文件是什么)。
是否有类似于上述链接的分步说明,这些说明很容易理解?
答案 0 :(得分:54)
您将需要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
答案 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名称):
// Function declaration
__declspec(dllexport) void foo(void);
// Function definition
#include <A.h>
void foo(void) {
; // definition
}
如果在Visual Studio中构建上述dll项目,则编译器将生成 X.dll 以及 X.lib [已导出函数 foo < / strong> by __declspec(dllexport)]。
// 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