(一)ncnn | Windows(VS2022)编译实战与避坑指南

张开发
2026/6/26 13:58:37 15 分钟阅读
(一)ncnn | Windows(VS2022)编译实战与避坑指南
1. 从零开始为什么选择ncnnVS2022组合第一次接触ncnn框架的朋友可能会有疑问为什么要在Windows平台折腾这个我去年接手一个工业质检项目时需要把训练好的YOLOv7模型部署到产线工控机上。当时尝试了各种方案最终发现ncnn在x86平台上的推理速度比原版PyTorch快3倍以上内存占用却只有1/3。更重要的是它生成的单个exe文件可以直接扔给客户不用配一堆Python环境。现在VS2022对C20的支持更完善了编译ncnn时能获得更好的优化。实测同样的ResNet18模型用VS2022编译的ncnn比VS2019版本推理速度快8%左右。不过要注意VS2022的MSVC工具链有几个坑要特别注意后文会详细说。2. 环境准备这些工具一个都不能少2.1 Visual Studio 2022的正确打开方式安装VS2022时千万别直接点下一步我见过太多人在这里翻车。关键是要勾选使用C的桌面开发工作负载右侧细节面板中的Windows 10 SDK (10.0.19041.0)英文语言包避免中文路径问题最近有个学员反馈编译时报LNK2001: unresolved external symbol错误就是因为没装英文包导致字符集冲突。装完后建议创建个空项目测试下确保能正常编译Hello World。2.2 CMake的版本玄学官方说支持CMake 3.10但我实测3.24.2会报protobuf配置错误3.21.3反而最稳。安装时记得勾选Add CMake to system PATH否则后面命令行操作会提示找不到cmake命令。验证安装成功的正确姿势是cmake --version如果返回版本号但编译时报错可能是系统残留了旧版本。我一般用Everything搜索所有cmake.exe删干净再重装。2.3 OpenCV的隐藏陷阱虽然ncnn只需要OpenCV的核心模块但建议直接装官方预编译包。有个坑是OpenCV 4.6.0开始默认不提供vc14VS2015的库而VS2022用的是vc17工具链。下载时认准带vc17字样的版本比如我用的opencv-4.5.5-vc14_vc15.exe。环境变量要设两个路径D:\opencv\build\x64\vc15\bin D:\opencv\build\x64\vc15\lib别漏了lib路径否则cmake会找不到OpenCVConfig.cmake。3. 依赖项编译那些官方没明说的细节3.1 protobuf的编译陷阱protobuf 3.4.0在VS2022下直接编译会报C20语法冲突需要修改两处在cmake命令行添加-DCMAKE_CXX_STANDARD17编辑protobuf源码中的src/google/protobuf/stubs/common.cc注释掉第387行的//static constexpr int kLg2Size 63 - __builtin_clzll(sizeof(T));编译命令建议这样写cmake -GNMake Makefiles -DCMAKE_BUILD_TYPERelease -DCMAKE_INSTALL_PREFIX%cd%/install -Dprotobuf_BUILD_TESTSOFF -Dprotobuf_MSVC_STATIC_RUNTIMEOFF -DCMAKE_CXX_STANDARD17 ../cmake3.2 Vulkan SDK的版本控制最新Vulkan SDK 1.3.250.0有个大坑它的glslangValidator.exe会与ncnn冲突。建议用1.2.198.1版本下载后要检查安装路径不能有中文和空格环境变量VULKAN_SDK要指向正确路径运行vkcube.exe测试是否正常4. ncnn编译实战手把手避坑指南4.1 源码获取的正确姿势千万别直接git clone官方仓库缺少submodule建议去Release页面下载ncnn-YYYYMMDD-full-source.zip解压路径建议全英文比如D:\libs\ncnn-20230517检查glslang文件夹是否非空4.2 CMake配置的黄金参数在x64 Native Tools命令行中执行cmake -GNMake Makefiles ^ -DCMAKE_BUILD_TYPERelease ^ -DCMAKE_INSTALL_PREFIX%cd%/install ^ -DProtobuf_INCLUDE_DIR../../protobuf-3.4.0/build-vs2022/install/include ^ -DProtobuf_LIBRARIES../../protobuf-3.4.0/build-vs2022/install/lib/libprotobuf.lib ^ -DProtobuf_PROTOC_EXECUTABLE../../protobuf-3.4.0/build-vs2022/install/bin/protoc.exe ^ -DNCNN_VULKANON ^ -DNCNN_SYSTEM_GLSLANGON ^ -DGLSLANG_VALIDATOR_DIRC:/VulkanSDK/1.2.198.1/Bin ^ -DOpenCV_DIRD:/opencv/build ^ ..关键点路径中的斜杠用正斜杠/避免转义问题NCNN_SYSTEM_GLSLANG必须设为ONGLSLANG_VALIDATOR_DIR要指向Vulkan SDK的Bin目录4.3 编译过程中的紧急救援如果nmake时卡在[XX%] Building CXX object...试试这些方法开任务管理器结束所有MSBuild进程删掉build目录重新cmake添加参数-j4启用多核编译但可能引发OOM遇到fatal error C1060: compiler is out of heap space时修改C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets找到段落添加/Zm20005. 验证与部署你的ncnn真的能用吗编译完别急着关窗口先跑几个测试nmake install cd ../examples ../build-vs2022/tests/benchmark.exe ../benchmark/benchncnn.json正常应该看到各模型的推理时间。如果报错找不到vcomp140.dll去VS安装器勾选Intel C Compiler Redistributable。部署时记得打包这些文件build-vs2022/install/bin下的所有dllexamples文件夹中的模型文件对应的OpenCV dll去年给客户部署时我写了个自动打包脚本$ncnn_bin D:\ncnn-20230517\build-vs2022\install\bin\* $opencv_bin D:\opencv\build\x64\vc15\bin\opencv_world455.dll Copy-Item $ncnn_bin,$opencv_bin -Destination .\release最后提醒如果要用Vulkan加速目标机器必须安装对应版本的Vulkan Runtime。我习惯在安装包里集成Vulkan-Loader的离线安装包避免用户环境问题。

更多文章