在 Windows 的 Visual Studio 2017 中编译 ncnn Debug 版本
ncnn 是腾讯开源的轻量级神经网络推理框架,广泛用于嵌入式设备和移动端推理。在开发过程中,Debug 版本的 ncnn 库对于调试模型加载和推理问题尤为重要。本文详细介绍如何在 Windows 的 Visual Studio 2017 (VS2017) 中编译 ncnn 的 Debug 版本,并配置项目以使用 #include "ncnn/net.h"
进行调试。以下步骤基于实际路径和环境,涵盖依赖安装、编译流程和项目配置,适合初学者和进阶开发者。
前期准备
编译 ncnn 的 Debug 版本需要以下工具和依赖:
- Visual Studio 2017:确保安装了“使用 C++ 的桌面开发”工作负载。
- CMake:版本 3.12 或更高,用于生成构建文件。
- Protobuf:版本 3.11.2(Debug 版本),已安装在
E:\Protobuf\protobuf-3.11.2\install-debug
。 - zlib:Debug 版本,已安装在
E:\zlib\zlib-master\build-vs2017\install
。 - ncnn 源码:解压到
E:\ncnn\ncnn-master
(推荐使用最新版本,如ncnn-20221128
)。 - 环境:确保 Anaconda 环境已禁用,避免路径冲突。
环境验证
- VS2017:在“开始”菜单找到“x64 Native Tools Command Prompt for VS 2017”。
- CMake:运行
cmake --version
,确认版本 ≥ 3.12。 - Protobuf:确认
E:\Protobuf\protobuf-3.11.2\install-debug\lib\libprotobufd.lib
和E:\Protobuf\protobuf-3.11.2\install-debug\bin\protoc.exe
存在。 - zlib:确认
E:\zlib\zlib-master\build-vs2017\install\lib\zlibd.lib
和E:\zlib\zlib-master\build-vs2017\install\include\zlib.h
存在。 - Anaconda:运行
ECHO %PATH%
,确保不包含C:\ProgramData\Anaconda3
。
步骤 1:清理 ncnn 构建目录
为避免缓存导致的配置错误,清理之前的构建文件:
- 打开“x64 Native Tools Command Prompt for VS 2017”。
- 进入 ncnn 的 Debug 构建目录:
cd E:\ncnn\ncnn-master\build-vs2017-debug
- 删除 CMake 缓存:
del CMakeCache.txt rmdir /S /Q CMakeFiles
步骤 2:配置并编译 ncnn Debug 版本
使用 CMake 配置 ncnn 的 Debug 版本,指定 Protobuf 和 zlib 的路径。
运行 CMake:
在E:\ncnn\ncnn-master\build-vs2017-debug
目录下执行:cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install-debug -DProtobuf_INCLUDE_DIR=E:/Protobuf/protobuf-3.11.2/install-debug/include -DProtobuf_LIBRARIES=E:/Protobuf/protobuf-3.11.2/install-debug/lib/libprotobufd.lib -DProtobuf_PROTOC_EXECUTABLE=E:/Protobuf/protobuf-3.11.2/install-debug/bin/protoc.exe -DZLIB_INCLUDE_DIR=E:/zlib/zlib-master/build-vs2017/install/include -DZLIB_LIBRARY=E:/zlib/zlib-master/build-vs2017/install/lib/zlibd.lib -DNCNN_VULKAN=OFF ..
- 参数解析:
-G"NMake Makefiles"
:使用 NMake 构建工具,适配 VS2017。-DCMAKE_BUILD_TYPE=Debug
:生成 Debug 版本,包含调试符号。-CMAKE_INSTALL_PREFIX=../install-debug
:安装到E:\ncnn\ncnn-master\install-debug
。-DProtobuf_*
:指定 Protobuf 3.11.2 的 Debug 版本路径。-DZLIB_*
:指定 zlib 的 Debug 版本路径。-DNCNN_VULKAN=OFF
:禁用 Vulkan(若需 GPU 加速,设为ON
并安装 Vulkan SDK)。
- 参数解析:
编译并安装:
nmake nmake install
- 编译完成后,
E:\ncnn\ncnn-master\install-debug
包含:include
:ncnn/net.h
等头文件。lib
:ncnnd.lib
(Debug 版本)。bin
:ncnnd.dll
和工具(如caffe2ncnn.exe
)。
- 编译完成后,
步骤 3:验证编译结果
- 检查工具:
确认caffe2ncnn.exe
是否生成:cd E:\ncnn\ncnn-master\install-debug\bin dir caffe2ncnn.exe
- 测试运行:
若报 DLL 缺失,复制以下文件到.\caffe2ncnn.exe
bin
目录:E:\ncnn\ncnn-master\install-debug\bin\ncnnd.dll
E:\Protobuf\protobuf-3.11.2\install-debug\bin\libprotobufd.dll
E:\zlib\zlib-master\build-vs2017\install\bin\zlibd.dll
步骤 4:配置 VS2017 项目
在 VS2017 中创建一个项目,使用 Debug 版本的 ncnn 进行调试。
创建项目:
- 打开 VS2017,创建“Win32 控制台应用程序”(空项目)。
- 配置为
Debug
和x64
平台。
添加示例代码:
创建main.cpp
,用于测试 ncnn 模型加载:#include <ncnn/net.h> #include <iostream> int main() { ncnn::Net net; net.opt.use_vulkan_compute = false; int param_result = net.load_param("squeezenet_v1.1.param"); if (param_result != 0) { std::cerr << "Failed to load param: " << param_result << std::endl; return -1; } int model_result = net.load_model("squeezenet_v1.1.bin"); if (model_result != 0) { std::cerr << "Failed to load model: " << model_result << std::endl; return -1; } std::cout << "Model loaded successfully" << std::endl; return 0; }
- 下载
squeezenet_v1.1.param
和squeezenet_v1.1.bin
(从 ncnn 模型仓库),放入项目Debug
目录。
- 下载
配置项目属性:
- 右键项目 ->“属性”,选择
Debug | x64
。 - C/C++ -> 常规 -> 附加包含目录:
E:\ncnn\ncnn-master\install-debug\include
E:\Protobuf\protobuf-3.11.2\install-debug\include
E:\zlib\zlib-master\build-vs2017\install\include
- 链接器 -> 常规 -> 附加库目录:
E:\ncnn\ncnn-master\install-debug\lib
E:\Protobuf\protobuf-3.11.2\install-debug\lib
E:\zlib\zlib-master\build-vs2017\install\lib
- 链接器 -> 输入 -> 附加依赖项:
ncnnd.lib
libprotobufd.lib
zlibd.lib
- C/C++ -> 代码生成 -> 运行时库:
- 选择“多线程调试 DLL (/MDd)”。
- 右键项目 ->“属性”,选择
配置 DLL:
- 复制以下 DLL 到项目
Debug
目录:E:\ncnn\ncnn-master\install-debug\bin\ncnnd.dll
E:\Protobuf\protobuf-3.11.2\install-debug\bin\libprotobufd.dll
E:\zlib\zlib-master\build-vs2017\install\bin\zlibd.dll
- 或者将上述
bin
目录添加到系统 PATH:set PATH=%PATH%;E:\ncnn\ncnn-master\install-debug\bin;E:\Protobuf\protobuf-3.11.2\install-debug\bin;E:\zlib\zlib-master\build-vs2017\install\bin
- 复制以下 DLL 到项目
调试:
- 在
net.load_param
处设置断点,按 F5 启动调试。 - 检查模型加载是否成功,验证输出。
- 在
常见问题与解决
LNK1104: 无法打开文件“zlibd.lib”:
- 确认
E:\zlib\zlib-master\build-vs2017\install\lib\zlibd.lib
存在。 - 若缺失,重新编译 zlib Debug 版本:
cd E:\zlib\zlib-master\build-vs2017 del CMakeCache.txt rmdir /S /Q CMakeFiles cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug -CMAKE_INSTALL_PREFIX=../install .. nmake nmake install
- 确认
Protobuf 警告(如
static_cast
截断):- Protobuf 3.11.2 可能与 ncnn 不完全兼容。尝试切换到 3.4.0:
cd E:\Protobuf\protobuf-3.4.0 mkdir build-vs2017-debug cd build-vs2017-debug cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug -CMAKE_INSTALL_PREFIX=../install-debug -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ../cmake nmake nmake install
- 更新 ncnn 的 CMake 命令:
cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install-debug -DProtobuf_INCLUDE_DIR=E:/Protobuf/protobuf-3.4.0/install-debug/include -DProtobuf_LIBRARIES=E:/Protobuf/protobuf-3.4.0/install-debug/lib/libprotobufd.lib -DProtobuf_PROTOC_EXECUTABLE=E:/Protobuf/protobuf-3.4.0/install-debug/bin/protoc.exe -DZLIB_INCLUDE_DIR=E:/zlib/zlib-master/build-vs2017/install/include -DZLIB_LIBRARY=E:/zlib/zlib-master/build-vs2017/install/lib/zlibd.lib -DNCNN_VULKAN=OFF ..
- Protobuf 3.11.2 可能与 ncnn 不完全兼容。尝试切换到 3.4.0:
DLL 缺失:
- 运行时若提示缺少
ncnnd.dll
、libprotobufd.dll
或zlibd.dll
,检查 DLL 是否在项目Debug
目录或 PATH 中。
- 运行时若提示缺少
CMake 错误:
- 确认所有路径无空格,使用正斜杠(
/
)。 - 删除
CMakeCache.txt
和CMakeFiles
后重试。
- 确认所有路径无空格,使用正斜杠(
总结
通过以上步骤,你可以在 Windows 的 VS2017 中成功编译 ncnn 的 Debug 版本,并配置项目进行调试。关键点包括:
- 使用正确的 Debug 版本依赖(Protobuf 3.11.2 和 zlib)。
- 清理 CMake 缓存以避免配置错误。
- 配置 VS2017 项目,确保运行时库为
/MDd
。 - 复制必要的 DLL 文件以支持运行和调试。
若遇到问题,可参考 ncnn 官方 Wiki 或提供错误日志,我将进一步协助!
参考资源: