很多时候第三方库或其他项目提供的库多数会以动态库的形式提供dll以及相应的lib导入库、头文件,不过也有的只是提供dll和头文件,或者也提供了def模块定义(用于导出函数)文件,此时若使用将不得不调用LoadLibrary以及GetProcAddress以获取一系列需要的函数,相对来说比较繁琐;多数人更喜欢使用引入库的方式。
此时需要通过提供的dll或者def文件来获取lib导入库文件,操作步骤如下:
1. 若只提供dll,则需通过dumpbin工具提取dll中导出的各个函数;
dumpbin /exports xxx.dll > xxx.def
2. 若xxx.def 文件不是标准的def模块定义文件(事实上不是标准的),则修改为标准的格式,若提供了def文件则可以直接通过lib工具转换提取lib引入库文件;
lib /def:xxx.def /machine:x86 out/:xxx.lib 或 lib /def:xxx.def /machine:x64 out/:xxx.lib
以上分别为提取x86、x64位的引入库文件;out为可选项,若忽略,则生成的lib引入库文件的名称同def文件名;
3. 此后便可使用引入库的方式使用提供的库。
事实上某些时候使用LoadLibrary方式可能比较友好,可以提供一些版本不一致的友好提示等,若采用引入库方式,此时若版本不一致可能出现异常,直接导致程序崩溃的可能而没有预兆、有意义的提示, 若不想使用太多的GetProcAddress又想友好一些,可以采用将导出接口封装,即可通过结构体保存导出接口地址,此时当导出接口的时候可不再导出这些众多接口,而是导出封装后的一个或几个接口而已;便于C接口或C++等调用,当然若只是给C++使用,则可直接导出类即可,这样整个类的公用接口即可直接使用,也可以避免太多的GetProcAddress调用;