Est-il possible de générer automatiquement une bibliothèque d'importation MSVC (fichier LIB) à partir d'une DLL ? Comment?
Réponses
Trop de publicités?Vous pouvez générer un fichier DEF en utilisant dumpbin /exports :
echo LIBRARY SQLITE3 > sqlite3.def
echo EXPORTS >> sqlite3.def
for /f "skip=19 tokens=4" %A in ('dumpbin /exports sqlite3.dll') do echo %A >> sqlite3.def
Le bibliothécaire peut utiliser ce fichier DEF pour générer la LIB :
lib /def:sqlite3.def /out:sqlite3.lib /machine:x86
Tous les noms de fichiers ( sqlite3.dll
, sqlite3.def
, etc.) doivent être précédés des chemins complets.
Je sais que le sujet est ancien, mais je n'ai toujours pas trouvé de script ou de fichier batch sur Internet pour le faire. Donc, sur la base de la réponse de Dark Falcon, j'ai créé ce script, que vous pouvez enregistrer en tant que dll2lib.bat et exécuter :
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
Je suis sûr que le script peut être amélioré, mais j'espère qu'il sera utile.
Ce script crée *.lib à partir de *.dll transmis dans %1 :
@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%
Vous pouvez le nommer implib.bat et exécuter : implib.bat C:\folder\mydll.dll
qui produit C:\folder\mydll.lib