在 Windows 的 Visual Studio 2017 中编译 ncnn Debug 版本

发布于:2025-05-22 ⋅ 阅读:(17) ⋅ 点赞:(0)

在 Windows 的 Visual Studio 2017 中编译 ncnn Debug 版本

ncnn 是腾讯开源的轻量级神经网络推理框架,广泛用于嵌入式设备和移动端推理。在开发过程中,Debug 版本的 ncnn 库对于调试模型加载和推理问题尤为重要。本文详细介绍如何在 Windows 的 Visual Studio 2017 (VS2017) 中编译 ncnn 的 Debug 版本,并配置项目以使用 #include "ncnn/net.h" 进行调试。以下步骤基于实际路径和环境,涵盖依赖安装、编译流程和项目配置,适合初学者和进阶开发者。


前期准备

编译 ncnn 的 Debug 版本需要以下工具和依赖:

  1. Visual Studio 2017:确保安装了“使用 C++ 的桌面开发”工作负载。
  2. CMake:版本 3.12 或更高,用于生成构建文件。
  3. Protobuf:版本 3.11.2(Debug 版本),已安装在 E:\Protobuf\protobuf-3.11.2\install-debug
  4. zlib:Debug 版本,已安装在 E:\zlib\zlib-master\build-vs2017\install
  5. ncnn 源码:解压到 E:\ncnn\ncnn-master(推荐使用最新版本,如 ncnn-20221128)。
  6. 环境:确保 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.libE:\Protobuf\protobuf-3.11.2\install-debug\bin\protoc.exe 存在。
  • zlib:确认 E:\zlib\zlib-master\build-vs2017\install\lib\zlibd.libE:\zlib\zlib-master\build-vs2017\install\include\zlib.h 存在。
  • Anaconda:运行 ECHO %PATH%,确保不包含 C:\ProgramData\Anaconda3

步骤 1:清理 ncnn 构建目录

为避免缓存导致的配置错误,清理之前的构建文件:

  1. 打开“x64 Native Tools Command Prompt for VS 2017”。
  2. 进入 ncnn 的 Debug 构建目录:
    cd E:\ncnn\ncnn-master\build-vs2017-debug
    
  3. 删除 CMake 缓存:
    del CMakeCache.txt
    rmdir /S /Q CMakeFiles
    

步骤 2:配置并编译 ncnn Debug 版本

使用 CMake 配置 ncnn 的 Debug 版本,指定 Protobuf 和 zlib 的路径。

  1. 运行 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)。
  2. 编译并安装

    nmake
    nmake install
    
    • 编译完成后,E:\ncnn\ncnn-master\install-debug 包含:
      • includencnn/net.h 等头文件。
      • libncnnd.lib(Debug 版本)。
      • binncnnd.dll 和工具(如 caffe2ncnn.exe)。

步骤 3:验证编译结果

  1. 检查工具
    确认 caffe2ncnn.exe 是否生成:
    cd E:\ncnn\ncnn-master\install-debug\bin
    dir caffe2ncnn.exe
    
  2. 测试运行
    .\caffe2ncnn.exe
    
    若报 DLL 缺失,复制以下文件到 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 进行调试。

  1. 创建项目

    • 打开 VS2017,创建“Win32 控制台应用程序”(空项目)。
    • 配置为 Debugx64 平台。
  2. 添加示例代码
    创建 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.paramsqueezenet_v1.1.bin(从 ncnn 模型仓库),放入项目 Debug 目录。
  3. 配置项目属性

    • 右键项目 ->“属性”,选择 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)”。
  4. 配置 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
      
  5. 调试

    • net.load_param 处设置断点,按 F5 启动调试。
    • 检查模型加载是否成功,验证输出。

常见问题与解决

  1. 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
      
  2. 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 ..
      
  3. DLL 缺失

    • 运行时若提示缺少 ncnnd.dlllibprotobufd.dllzlibd.dll,检查 DLL 是否在项目 Debug 目录或 PATH 中。
  4. CMake 错误

    • 确认所有路径无空格,使用正斜杠(/)。
    • 删除 CMakeCache.txtCMakeFiles 后重试。

总结

通过以上步骤,你可以在 Windows 的 VS2017 中成功编译 ncnn 的 Debug 版本,并配置项目进行调试。关键点包括:

  • 使用正确的 Debug 版本依赖(Protobuf 3.11.2 和 zlib)。
  • 清理 CMake 缓存以避免配置错误。
  • 配置 VS2017 项目,确保运行时库为 /MDd
  • 复制必要的 DLL 文件以支持运行和调试。

若遇到问题,可参考 ncnn 官方 Wiki 或提供错误日志,我将进一步协助!

参考资源