81 votes

Comment générer une bibliothèque d'importation (fichier LIB) à partir d'une DLL ?

Est-il possible de générer automatiquement une bibliothèque d'importation MSVC (fichier LIB) à partir d'une DLL ? Comment?

94voto

Dark Falcon Points 15609

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.

23voto

Conrad Poelman Points 663

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.

11voto

vyshulga Points 101

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X