欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

dll导出def和lib文件

程序员文章站 2022-03-04 19:04:04
...

文章目录


在Windows下编程的同学,可能都知道可以使用Depends这个工具查看dll依赖项和导出符号,
却很少知道在命令行下,有两个更好用的命令,分别是dumpbin和lib,这是VS安装目录下的两个程序。

dumpbin

用法: DUMPBIN [选项] [文件]

  选项:

   /ALL
   /ARCHIVEMEMBERS
   /CLRHEADER
   /DEPENDENTS
   /DIRECTIVES
   /DISASM[:{BYTES|NOBYTES}]
   /ERRORREPORT:{NONE|PROMPT|QUEUE|SEND}
   /EXPORTS
   /FPO
   /HEADERS
   /IMPORTS[:文件名]
      /LINENUMBERS
   /LINKERMEMBER[:{1|2}]
   /LOADCONFIG
   /NOLOGO
      /OUT:filename
   /PDATA
   /PDBPATH[:VERBOSE]
   /RANGE:vaMin[,vaMax]
   /RAWDATA[:{NONE|1|2|4|8}[,#]]
   /RELOCATIONS
   /SECTION:名称
   /SUMMARY
   /SYMBOLS
   /TLS

/HEADERS可以查看dll的位数X86/X64,有哪些SECTION;
/DEPENDENTS可以查看依赖项,这和可视化工具Depends功能一样;
/EXPORTS xxx.dll查看导出符号,即dll中包含哪些函数;
/IMPORTS xxx.dll查看从依赖项中具体需要导入的函数;
/LINKERMEMBER xxx.lib则可以查看静态导入库中导入了哪些函数;

这里我们要制作dll对应的lib静态导入文件,就需要先产生def文件
由/EXPORTS选项即可查看,但显示的信息不是按照def文件格式来的,需要我们手动调整;

Dump of file libReadFace.dll

File Type: DLL

  Section contains the following exports for libReadFace.dll

    00000000 characteristics
    5B740FAD time date stamp Wed Aug 15 12:34:05 2018
        0.00 version
           1 ordinal base
          45 number of functions
          45 number of names

    ordinal hint RVA      name

          1    0 00002780 releaseFaceDetectResult
          2    1 000028F0 releaseFaceTrackResult
          3    2 00007820 rsGetCroppedFaceByTrackId
          4    3 00002930 rsGetFaceQualityScore
          5    4 000079E0 rsGetRSFaceSDKVersion
          6    5 00001DF0 rsGetSDKLicenseDeviceKey
          7    6 000042B0 rsInitAttributeDetect
          8    7 000079B0 rsInitDepthLivenessDetect
          9    8 00007540 rsInitFaceCrop
         10    9 00002710 rsInitFaceDetect
         11    A 00002910 rsInitFaceQuality
         12    B 00004FF0 rsInitFaceRecognition
         13    C 000027E0 rsInitFaceTrack
         14    D 00001E00 rsInitLicenseManager
         15    E 00006460 rsInitLivenessDetect
         16    F 00002850 rsInitSingleFaceTrack

pexport

这里我们介绍另一款工具,pexport
下载地址http://sourceforge.net/projects/mingw/files/MinGW/Extension/pexports
这是mingw项目下的一款工具

使用命令

pexports -o xxx.dll  > xxx.def

即可直接导出标准的def文件

lib

接下来就是使用lib命令,制作对应的lib文件了

用法: LIB [选项] [文件]

  选项:

   /DEF[:文件名]
   /ERRORREPORT:{NONE|PROMPT|QUEUE|SEND}
   /EXPORT:符号
   /EXTRACT:成员名
   /INCLUDE:符号
   /LIBPATH:目录
   /LIST[:文件名]
   /LTCG
   /MACHINE:{ARM|ARM64|EBC|X64|X86}
   /NAME:文件名
   /NODEFAULTLIB[:库]
   /NOLOGO
   /OUT:文件名
   /REMOVE:成员名
   /SUBSYSTEM:{BOOT_APPLICATION|CONSOLE|EFI_APPLICATION|
         EFI_BOOT_SERVICE_DRIVER|EFI_ROM|EFI_RUNTIME_DRIVER|
         NATIVE|POSIX|WINDOWS|WINDOWSCE}[,#[.##]]
   /VERBOSE
   /WX[:NO]
lib /DEF:xxx.def /MACHINE:X64 /OUT:xxx.lib

至此,我们就可以在MSVC编译器中,使用

#pragma comment(lib, "xxx.lib")

即可直接调用头文件中声明的函数了。