由dll导出lib文件

  老生长谈的问题了,网上的教程也很多,这里以实际例子作个备份,并说明下注意点。

  只有dll文件(my.test.dll)和头文件,没有lib文件,需要导出lib,静态编译进代码中,用VS自带的dumpbin.exe和lib.exe来完成。

  dumpbin.exe和lib.exe的路径不赘述,路径见下图:

 

  先用如下命令行导出dll的相关信息:

dumpbin /exports my.test.dll > my.test.def
  导出的my.test.def文件内容如下:
Microsoft (R) COFF Binary File Dumper Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


Dump of file my.test.dll

File Type: DLL

  Section contains the following exports for testdll.dll

           0 characteristics
    587C3C7E time date stamp Mon Jan 16 11:22:38 2017
        0.00 version
           1 ordinal base
           4 number of functions
           4 number of names

    ordinal hint RVA      name

          1    0 0000113C ??0CTestdll@@QAE@XZ
          2    1 00001000 ??4CTestdll@@QAEAAV0@ABV0@@Z
          3    2 00001127 ?fnTestdll@@YAHXZ
          4    3 0000318C ?nTestdll@@3HA

  Summary

        1000 .data
        1000 .rdata
        1000 .reloc
        1000 .text

  然后,修改my.test.def文件如下:
LIBRARY my.test.dll 
EXPORTS 
??0CTestdll@@QAE@XZ @1 
??4CTestdll@@QAEAAV0@ABV0@@Z @2 
?fnTestdll@@YAHXZ @3 
?nTestdll@@3HA @4 

  实际测试,后面也可以不带“@数字”,或者如下:

LIBRARY my.test.dll 
EXPORTS 
??0CTestdll@@QAE@XZ
??4CTestdll@@QAEAAV0@ABV0@@Z
?fnTestdll@@YAHXZ
?nTestdll@@3HA

  注意,以上内容中LIBRARY后面一定要是dll文件的文件名。如果文件名(不含后缀)中还带有“.",则需要把最后的.dll带上。比如此例中文件全名为my.test.dll, 则LIBRARY后面一定要写my.test.dll,否则调用程序编译链接后,运行时会提示找不到my.test。如果文件全名为test.dll,则LIBRARY后可写test.dll,也可写test。

  然后用以下命令行制作lib文件,即可生成lib文件:

lib /def:my.test.def /machine:ix86 /out:my.test.lib

  How to generate an import library (LIB-file) from a DLL?这里有人制作了一个批处理文件,我修改了一下,可以直接使用,批处理文件名为《dll2lib.bat》,直接调用命令dll2lib.bat 32 my.test.dll即可。

@echo off
echo Usage: dll2lib [32^|64] some-file.dll
echo.
echo Generates some-file.lib from some-file.dll, making an intermediate
echo some-file.def from the results of dumpbin /exports some-file.dll.
echo Currently must run without path on DLL.
echo (Fix by removing path when of lib_name for LIBRARY line below?)
echo.
echo Requires 'dumpbin' and 'lib' in PATH - run from VS developer prompt.
echo.
echo Script inspired by http://stackoverflow.com/questions/9946322/how-to-generate-an-import-library-lib-file-from-a-dll
echo.
echo.
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%.dll > %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


### 回答1: makeexport dll导出lib是一个非常常见的操作。一般来说,这是因为我们需要将一个动态链接库中的函数导出到一个静态链接库中,以供其他代码使用。这个过程需要使用一些工具,主要有两个,分别是makeexports和lib。 首先,我们需要使用makeexports工具来生成一个.def文件,该文件列出了我们想要导出的函数和它们在库中的名称。然后,我们可以使用lib工具将这些导出函数生成为一个静态链接库。这个过程确保了我们可以使用这些函数而不需要动态加载它们。 makeexports工具和lib工具都是微软Visual Studio开发环境自带的工具,可以在命令行中使用。如果你使用的是其他编译器或开发环境,则可以使用类似的工具来实现相同的目的。 总的来说,将动态链接库导出为静态链接库是一个重要的操作,使我们可以将函数共享给其他代码而不需要它们运行时被动态加载。 ### 回答2: makeexport是一个工具,用于从动态链接库(DLL)中导出函数。这个工具可以通过在命令行中指定DLL导出函数列表来生成一个LIB文件,这个LIB文件包含DLL导出函数的符号和地址信息,以便在链接期间使用。 如果你需要使用某个DLL中的函数,但是没有相应的头文件LIB文件,那么你可以使用makeexport工具来生成一个LIB文件。具体操作步骤如下: 1. 下载makeexport工具; 2. 在命令行中运行makeexport,并指定需要生成LIB文件DLL以及导出函数列表; 3. 执行完命令后,会在当前目录下生成一个LIB文件; 4. 将LIB文件添加到你的项目中,以便在链接期间使用。 需要注意的是,使用makeexport工具生成的LIB文件只包含DLL中指定的导出函数。如果你需要使用DLL中其他的函数,你需要使用其他工具或手动编写相应的头文件LIB文件。 总的来说,使用makeexport工具来生成LIB文件可以方便地使用DLL中的函数,但是需要注意生成的LIB文件不一定包含所有函数信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值