ncnn在windows+vs 2017的入门及一些坑
ncnn是腾讯开源的针对手机端的神经网络前向框架。针对未来可能遇到的手机端实现需求,进行提前了解,并将遇到的一些坑在此记录。
源码编译
首先就是源码编译,具体的一些命令参考这里https://github.com/Tencent/ncnn/wiki/how-to-build#build-for-windows-x64-using-visual-studio-community-2017。在安装了vs2017后,按win键,找到
vs2017的x64本机工具,并下载需要使用的库代码即可,按步骤输入命令。
值得注意的是,编译过程中的路径不要出现空格,否则编译结果的一些文件会因为空格的存在到别的文件夹中去,导致编译出现问题。
然后就是若使用vulkan进行编译时,将SDK中的一些关键路径放在环境变量中,防止编译过程中找不到某些文件。
不出意外就是成功编译了,得到的install文件夹中的include和lib文件夹在后续使用。
Vs2017下使用
在vs2017下使用时,若结合opencv进行使用的情况下,包含头文件时需要把opencv相关的头文件放在前面,否则会出现
d:\program files\opencv249\build\include\opencv2\core\types_c.h(311): error C2065: “__m128d”: 未声明的标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(311): error C2146: 语法错误: 缺少“;”(在标识符“t”的前面) 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(311): error C2065: “t”: 未声明的标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(311): error C3861: “_mm_set_sd”: 找不到标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(312): error C2065: “t”: 未声明的标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(312): error C3861: “_mm_cvtsd_si32”: 找不到标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(346): error C2065: “__m128d”: 未声明的标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(346): error C2146: 语法错误: 缺少“;”(在标识符“t”的前面) 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(346): error C2065: “t”: 未声明的标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(346): error C3861: “_mm_set_sd”: 找不到标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(347): error C2065: “t”: 未声明的标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(347): error C3861: “_mm_cvtsd_si32”: 找不到标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(348): error C2065: “t”: 未声明的标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(348): error C3861: “_mm_cvtsi32_sd”: 找不到标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(348): error C3861: “_mm_cmplt_sd”: 找不到标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(348): error C3861: “_mm_movemask_pd”: 找不到标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(363): error C2065: “__m128d”: 未声明的标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(363): error C2146: 语法错误: 缺少“;”(在标识符“t”的前面) 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(363): error C2065: “t”: 未声明的标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(363): error C3861: “_mm_set_sd”: 找不到标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(364): error C2065: “t”: 未声明的标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(364): error C3861: “_mm_cvtsd_si32”: 找不到标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(365): error C2065: “t”: 未声明的标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(365): error C3861: “_mm_cvtsi32_sd”: 找不到标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(365): error C3861: “_mm_cmplt_sd”: 找不到标识符 1>d:\program files\opencv249\build\include\opencv2\core\types_c.h(365): error C3861: “_mm_movemask_pd”: 找不到标识符
然后就是在项目-属性中配置一下包含目录和库目录,注意选择的配置类型(Release和Debug)和平台(x86和x64)
然后再VC++目录-包含目录和库目录中写入相关库(opencv,编译好的ncnn和vulkan)的include目录和lib目录,在链接器-输入-附加依赖项中写入相关库(opencv,编译好的ncnn和vulkan)的lib文件名(注意opencv在Release版本下的lib文件名没有d)
然后运行时的配置和平台选择刚刚配置的设置运行即可,ncnn-master下的examples中的squeezenet.cpp是一个例子,将代码里面用到的两个文件一并拷贝即可运行,在此不赘述。
-----------------------------
参考资料:
未添加依赖项会出现的错误:https://blog.csdn.net/tobefxz/article/details/22154469
ncnn在windows-vs2017下的编译方法:https://github.com/Tencent/ncnn/wiki/how-to-build#build-for-windows-x64-using-visual-studio-community-2017