一、dll文件编写
1.在visual studio 2015中创建一个win32控制台程序,选择dll项目
2. dll文件中的函数暴露的方式有两种。
- 在项目中创建模块定义文件*.def,dll暴露的函数名。允许其他人直接查看def文件来了解该dll提供了几个可用的函数(问题:重载函数是否只用在模块定义文件中声明一次?)
- 创建一个头文件,在头文件中,使用extern “C”方式暴露dll的函数名。(只在cpp文件中使用该方式会造成dllimport时找不到函数的链接错误,即便dumpbin能将dll中的函数名列出来)使用方式如下:
** extern “C” _declspec(dllexport) 返回值类型 函数名(形参列表);
** 例:extern "C" _declspec(dllexport) int inference(char * ImgPath, char * modelPath);
二、dll文件查看
1. 为了保证在cmd中使用dumpbin命令,需要首先在系统变量中添加VS相关的用户变量
- Path:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
- Path:C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE
2. 使用Visual Studio 2015中带有的dumpbin.exe程序来查看dll的相关信息。在开始菜单中Visual Studio 2015文件夹下打开VS2015开发人员命令提示(cmd也可以)
查看picturePredict.dll的导出函数:
- dumpbin /exports F:\deploy\picturePredict\x64\Release\picturePredict.dll
查看dll文件的位数信息:
- dumpbin /headers F:\deploy\picturePredict\x64\Release\picturePredict.dll
- 检查FILE HEADER VALUES的值中,是否标明32位dll文件。如果没有则是64位dll文件。
三、dll文件调用
以对picturePredict.lib的调用为例
1.创建一个win32控制台程序
2.文件依赖配置,右键项目,打开属性页
- 配置属性->常规->字符集:使用unicode字符集。需要和dll字符集类型保持一致。
- 配置属性->VC++目录->包含目录。添加控制台程序依赖的外部库的头文件目录路径(*\include)
- 配置属性->VC++目录->库目录。添加主程序依赖的库的dll文件路径(也可以直接吧dll放在程序根目录下)
- 配置属性->链接器->输入,附加依赖项中,添加对picturePredict.lib的引用
- 配置属性->链接器->输入->模块定义文件。添加相关*.def文件。如果dll生成时,外部函数暴露使用方式为def文件定义。
- 配置属性->链接器->所有选项,附加依赖项中,添加对picturePredict.lib的引用
3.相关文件引入
- lib文件所在路径如果没有在配置属性->VC++目录->库目录中声明,也可以直接将lib文件放置在程序cpp文件所在文件夹下。
- dll文件直接放置在项目路径\x64\Release\文件夹下。
- 如果使用创建头文件的方式来暴露dll中的函数,需要将头文件也添加在项目中。方式有两种,一种是在配置属性->VC++目录->包含目录中添加相关的头文件。一种是将项目头文件放置在程序cpp文件所在文件夹下,然后在主程序的头文件中,include该文件。
4.dll文件中的函数引入和使用
- 使用命令 extern “C” __declspec(dllexport) 返回值类型 函数名(形参列表);
例如:extern "C" __declspec(dllexport) int inference(char * ImgPath, char * modelPath);
- 导入成功后,该函数可以当成普通函数直接使用。