最近涉及要在c++上部署人脸检测的算法,要在Windows环境下编译运行MXNet。对于不熟悉c++的小白的我真是一件又让人抓狂又掉头发的事情。网上关于c++的部署的帖子少之又少,加上又是第一次摸这些东西,所以出现的bug真的数不胜数。写这个blog的目的就是记录下这些bug以及相应的解决方案,以便以后查找。
配置目标
VS2017 ,CUDA9.2, CUDNN7.6, Mxnet1.5.1
生成libmxnet.lib和libmxnet.dll
配置过程
这里先放上MXNet官方配置的过程,流程如下以供参考
Installing MXNet on Windows
Build the C++ package
下面就会详细记录在构建过程中遇到的一些问题以及我的解决方法,和一些需要注意的地方
1.构建VS2017和cuda的时候,切记首先安装VS,再安装cuda(一定要在自定义安装选项里面勾选Visual Studio Integration)
成功安装cuda如下:
2.操作步骤示例
在以下位置勾选VC++ 2017 version 15.4 v14.11 toolset
并在cmd窗口键入以下命令修改Visual Studio 2017的版本(注意自己VS安装路径)
3.在cmake MXNet源码的时候:
因为要编译c++,所以要加入:
4.
问题描述:在cmake过程中出现No CMAKE_CUDA_COMPILER could be found,但是明明已经将cuda的环境变量添加过了。
解决方法:
打开文件C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\include\crt\host_config.h,找到这一行:
将_MSC_VER>1913改为_MSC_VER>1920保存再次cmake,问题得到解决。
5.
在VS里完成对mxnet.sln的编译
Release ×64
- 在ALL_BUILD属性的VC++目录,在包含目录和库目录里添加相应的opencv的路径
- 在CUDA C/C++ Common 中将Target Machine Platform改为64位
- 按照自己电脑显卡的计算力填code generation
显卡算力查询
- 根据自己电脑情况填写最大进程数
- 解决方案里面,mxnet的核数设置为0
6.
问题描述:LNK118:无法打开输入文件"C:\Program.obj"
解决方法:
打开mxnet_50的属性-链接器-输入-附加依赖项
删除C:\Program所在行
最好将每个项目的链接器输入都打开看一下,如果出现这一行 ,删掉即可。
7.
问题描述:
编译过程中出现无法解析的外部命令,并且出现一堆无法识别的cudnn库里的符号。
点击mxnet属性-链接器-输入-附加依赖项,发现缺少cudnn.lib
解决方法:
手动将cudnn.lib的路径"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\lib\x64\cudnn.lib"加入。
8.
问题描述:无法打开包括文件:“mxnet-cpp/op.h”:No such file or directory
解决方法:直接去…/build/Release文件下查看有没有libmxnet.lib和libmxnet.dll文件。如果有,那么编译已经成功。上述错误可能是官方示例文件中包含的一些东西,只要编译出以下文件,从源构建mxnet的工作便已经完成。
终于在自己的pc上编译完成了mxnet的源码,下一步就是如何在c++上运行mxnet训练好的模型。