如何从DLL生成一个导入库(LIB文件)?

是否有可能从一个DLL自动生成一个MSVC导入库(LIB文件)? 怎么样?

您可以使用dumpbin / exports生成一个DEF文件 :

dumpbin /exports sqlite3.dll > exports.txt echo LIBRARY SQLITE3 > sqlite3.def echo EXPORTS >> sqlite3.def for /f "skip=19 tokens=4" %A in (exports.txt) do echo %A >> sqlite3.def 

图书管理员可以使用这个DEF文件来生成LIB:

 lib /def:sqlite3.def /out:sqlite3.lib /machine:x86 

所有的文件名( exports.txtsqlite3.dllsqlite3.def等)都应该被预置为完整路径。

我知道这个话题已经很久了,但是我仍然无法在互联网上的任何地方找到脚本或批处理文件来做到这一点。 所以基于黑暗猎鹰的回答,我已经制作了这个脚本,你可以保存为dll2lib.bat并运行:

 REM Usage: dll2lib [32|64] some-file.dll REM REM Generates some-file.lib from some-file.dll, making an intermediate REM some-file.def from the results of dumpbin /exports some-file.dll. REM Currently must run without path on DLL. REM (Fix by removing path when of lib_name for LIBRARY line below?) REM REM Requires 'dumpbin' and 'lib' in PATH - run from VS developer prompt. REM REM Script inspired by http://stackoverflow.com/questions/9946322/how-to-generate-an-import-library-lib-file-from-a-dll SETLOCAL if "%1"=="32" (set machine=x86) else (set machine=x64) set dll_file=%2 set dll_file_no_ext=%dll_file:~0,-4% set exports_file=%dll_file_no_ext%-exports.txt set def_file=%dll_file_no_ext%.def set lib_file=%dll_file_no_ext%.lib set lib_name=%dll_file_no_ext% dumpbin /exports %dll_file% > %exports_file% echo LIBRARY %lib_name% > %def_file% echo EXPORTS >> %def_file% for /f "skip=19 tokens=1,4" %%A in (%exports_file%) do if NOT "%%B" == "" (echo %%B @%%A >> %def_file%) lib /def:%def_file% /out:%lib_file% /machine:%machine% REM Clean up temporary intermediate files del %exports_file% %def_file% %dll_file_no_ext%.exp 

我相信脚本可以使用改进,但我希望它是有用的。

此脚本从* .dll传入%1中创建* .lib:

 @echo off setlocal enabledelayedexpansion for /f "tokens=1-4" %%1 in ('dumpbin /exports %1') do ( set /a ordinal=%%1 2>nul set /a hint=0x%%2 2>nul set /a rva=0x%%3 2>nul if !ordinal! equ %%1 if !hint! equ 0x%%2 if !rva! equ 0x%%3 set exports=!exports! /export:%%4 ) for /f %%i in ("%1") do set dllpath=%%~dpni start lib /out:%dllpath%.lib /machine:x86 /def: %exports% 

你可以命名它implib.bat并运行: implib.bat C:\folder\mydll.dll它产生C:\文件夹\ mydll.lib

是否有可能从一个DLL自动生成一个MSVC导入库(LIB文件)? 怎么样?

除了“黑鹰”的回答之外,微软还发布了如何在没有.OBJs或Source的情况下创建导入库 。

微软的第一个程序和黑鹰一样。 第二个过程稍微麻烦一点,但它显示了如何使用存根对象文件来完成它。 它适用于不同的调用约定和类。

这里是KB的第二个过程:

  1. 在原型或声明中使用“__declspec(dllimport)”时,请将其更改为“__declspec(dllexport)”。
  2. 对于不返回值的函数,C源代码中的C函数以及C ++源代码中的C函数(与“extern”C“结构一起使用),将终止函数原型的分号替换为大括号 (”{}”)。
  3. 对于返回值的C ++函数(全局函数或成员函数),您必须为该函数创建一个虚拟主体,并返回一个适当类型的虚拟值。 (在函数中没有return语句是非法的。)这也适用于类成员函数。 请记住,这个过程的目的是欺骗LIB工具生成正确的导入库,所以这些假身体没有任何作用。
  4. 对于C ++类,只要在编译时禁用函数内联,就可以通过在类声明中使用原型来将成员函数删除。
  5. 函数参数通常只是通过头文件中的类型来指定。 例如,Geta(int)。 添加虚拟函数体Geta(int x)时,必须指定虚拟参数标识符。 否则会生成错误C2055。