windows下lib,dll的生成及使用

时间:2022-02-12 00:12:41
导入库lib的生成:
文件mylib.dll
1、先用dumpbin.exe生成.def文件
(注:用vs2010下的dumpbin时,缺少mspdb100.dll,将Microsoft VisualStudio10.0\Common7\IDE\mspdb100.dll复制到\Microsoft Visual Studio 10.0\VC\bin;
        移动后编译工程时会出现 "fatal errorC1902:程序数据库管理器不匹配;请检查安装解决", 用完后删除mspdb100.dll)

a、命令: dumpbin /exports /out:mylib.def mylib.dll
b、生成的文件如下:
Dump of file mylib.dll
File Type: DLL
 Section contains the following exports for mylib.dll
00000000 characteristics
5527C8CE time date stamp Fri Apr 10 20:57:50 2015
0.00 version
  1 ordinal base
  1 number of functions
  1 number of names
ordinal hint RVA      name
 1    0 0000100A ?returnInt@@YAHPBD@Z
 Summary
7000 .data
1000 .idata
3000 .rdata
2000 .reloc
  2A000 .text
c、修改此文件,只留下 name 一列
修改后文件如下:
EXPORTS 
?returnInt@@YAHPBD@Z

(注:EXPORTS一定要大写) 

(也可以直接使用pexports工具,无需修改文件 命令: pexports mylib.dll > mylib.def)

2、 用lib.exe生成.lib文件 

lib /def:my.def /machine:相应的机器类型  /out:mylib.lib

(也可以用dlltool生成.lib文件,试了以后没有能用,可能是机器类型不符合,待解决)

dll文件的使用(环境是VC6):

方案1:将my.dll文件放到工程目录下,源文件中加入  #pragma comment(lib, "mylib.lib")或者将lib连接到工程里

方案2:使用loadlibrary(), getProcAddress()函数

注意事项:

1、__declspec( dllexport ) 一定要加,不加不能导出函数

2、在生成dll文件时,要注意导出函数的调用约定,使用的时候导出函数的声明要与dll中的函数声明一致,否则会找不到函数

3、getProcAddress中第二个参数并不简单的是源程序中的自己定义的函数名,而是编译器生成的标识。不同的调用约定,语言类型会使编译器生成不用的标识,可以用depends工具查看dll文件中的导出函数的标识名,然后再用getProcAddress获取函数指针

4、生成dll时,使用纯C的函数形式较好且调用约定为__cdecl,此时getProcAddress第二个参数可以直接填写为自己定义的函数名;在C++中使用此dll,记得加extern "C"