在程序使用Dll有两个加载方式,一种是动态方式,就是LoadLibrary载入Dll,然后用GetProcAddress来加载需要使用的Dll函数。另一种就是静态连接方式,将dll生成的lib,加入到工程中,然后使用时就像使用Win API一样使用。
今天我们不讨论动态载入的方式,我们采用静态载入的方式。但有一个问题,由于很多Dll发布的时候,根本就不提供lib,也或许你在使用一个未公开的dll,没有lib我们就不能静态加载,我手工来生成吧。
手工生成
可以使用PE解析器 或者dumpbin获取此Dll所有导出函数,然后将这些导出函数名复制出来,新一个xxx.def文件,其中的xxx为你的dll文件名,格式如下:
EXPORTS
sqlite3_aggregate_context
sqlite3_aggregate_count
sqlite3_auto_extension
sqlite3_backup_finish
sqlite3_backup_init
sqlite3_backup_pagecount
sqlite3_backup_remaining
sqlite3_backup_step
sqlite3_bind_blob
sqlite3_bind_double
sqlite3_bind_int
sqlite3_bind_int64
将xxx.dll和xxx.def,放到一个文件夹中,启动“Visual Studio 2005 命令提示”,位置:
“开始”->”Microsoft Visual Studio 2005″ -> “Visual Studio Tools” -> “Visual Studio 2005 命令提示”
将工作目录切换到放有xxx.dll和xxx.def的文件夹中输入:
lib /def:xxx.def /MACHINE:x86
这样将会产生一个xxx.lib了,将此lib文件和dll文件拷到工程中,就可以进行静态链接了。
IDE 生成
VS2005使用DEF文件来生成DLL与Lib时,与VC6的设置是不一样的。
VC6工程中,只要有DEF文件并将其添加到工程中,VC6就可以自动地生成DLL与其相应的Lib文件了。
但是VS2005不一样,需要指定DEF文件,方法如下:
把 sqlite.def 添加到工程中.
选择 工程 > 属性中的链接器,然后找到"输入"这一项. 在 "模块定义文件" 中输入 sqlite.def。
注意: 你需要在 Debug 和 Release 中都输入该项才行.