windows - Sådan genereres et importbibliotek (LIB-fil) fra en DLL?

Indlæg af Hanne Mølgaard Plasc

Problem



Er det muligt at autogenerere et MSVC-importbibliotek (LIB-fil) fra en DLL? Hvordan?

Bedste reference


Du kan generere en DEF-fil ved hjælp af dumpbin/eksport: [9]


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


Bibliotekeren kan bruge denne DEF-fil til at generere LIB:


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


Alle filnavne (exports.txt, sqlite3.dll, sqlite3.def osv.) Skal udfyldes med fulde stier.

Andre referencer 1


Jeg ved, emnet er gammelt, men jeg kunne stadig ikke finde et script eller en batchfil overalt på internettet for at gøre dette. Så baseret på Dark Falcons svar, har jeg lavet dette script, som du kan gemme som dll2lib. flagermus og løbe:


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


Jeg er sikker på, at scriptet kan bruge forbedring, men jeg håber det er nyttigt.

Andre referencer 2


Dette script skaber * .lib fra * .dll bestået i\% 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\%


Du kan nævne det implib.bat og køre: implib.bat C:foldermydll.dll som producerer C: \ folder \ mydll.lib

Andre referencer 3



  Er det muligt at autogenerere et MSVC-importbibliotek (LIB-fil) fra en DLL? Hvordan?



Ud over Dark Falcons svar har Microsoft udgivet procedurer til, hvordan man opretter importbiblioteker uden .OBJ eller kilde. [10]


Microsofts første procedure er den samme som Dark Falcon s. Den anden procedure er lidt mere besværlig, men det viser, hvordan man gør det med en objektfil ved hjælp af stubber. Det virker med forskellige opkaldskonventioner og klasser.


Her er den anden procedure fra KB:



  1. Når '\_\_declspec (dllimport)' bruges i en prototype eller erklæring, skal du ændre den til '\_\_declspec (dllexport).'

  2. For funktioner, der ikke returnerer en værdi, for C-funktioner i C-kilde og for C-funktioner i C ++-kildekoden (bruges med 'ekstern' C '' konstruktion), skal du erstatte semikolonet, der afslutter funktionsprototypen med en matchede par krøllede seler ('{}').

  3. For C + + -funktioner (globalt eller medlem), der returnerer en værdi, skal du oprette en dummy-krop til funktionen og returnere en dummy-værdi af den korrekte type. (Det er ikke ulovligt at have en returneringserklæring i funktionen.) Dette gælder også for klassemedlemsfunktioner. Husk, at formålet med denne procedure er at narre LIB-hjælpeprogrammet til at generere det korrekte importbibliotek, så disse dummylegemer har ingen effekt.

  4. For C ++-klasser kan du stub ud medlemsfunktionerne ved at bruge prototyperne i klassedeklarationen, så længe du deaktiverer funktionen, når du kompilerer.

  5. Funktionsargumenter angives normalt kun ved at skrive en headerfil. For eksempel Geta (int). En dummy argumentidentifikator skal angives, når du tilføjer dummyfunktionslegemet Geta (int x). Ellers genereres fejlen C2055.