当前位置: 首页 > news >正文

vs2017编译ncnn库

在 Windows 环境下,使用 Visual Studio 2017 配置 ncnn 库并在项目中包含 #include "ncnn/net.h",需要完成 ncnn 的编译和项目配置。以下是详细的步骤指南,确保环境配置正确,并成功链接 ncnn 库。


前提条件

  1. 已安装 Visual Studio 2017:确保安装了 Visual Studio 2017 Community 或其他版本,并包含 C++ 桌面开发工作负载(包括 MSVC 编译器和 CMake 工具)。
  2. 已安装 CMake:推荐使用 CMake 3.14 或更高版本,用于生成 ncnn 的构建文件。可以在 CMake 官网 下载安装。
  3. 已下载 ncnn 源码:从 Tencent/ncnn GitHub 仓库 下载最新 ncnn 源码(建议使用最新 release 或 master 分支)。
  4. 可选:支持 Vulkan:如果需要 GPU 加速(Vulkan 支持),需安装 Vulkan SDK。

步骤 1:编译 ncnn 库

ncnn 是一个需要编译的库,编译后会生成头文件、静态库(.lib)或动态库(.dll),供 Visual Studio 项目使用。

1.1 安装依赖

ncnn 的编译需要以下依赖:

  • Protobuf:ncnn 使用 Protobuf 处理模型文件。
  • 可选:Vulkan SDK:如果启用 Vulkan 支持,需要安装 Vulkan SDK。
  • 可选:OpenCV:如果需要使用 ncnn 的图像处理功能,需安装 OpenCV。
安装 Protobuf
  1. 下载 Protobuf 源码

    • 访问 Protobuf GitHub 仓库 下载源码(推荐 v3.4.0 或更高版本)。
    • 解压到本地目录,例如 C:\protobuf\protobuf-3.4.0
  2. 编译 Protobuf

    • 打开 x64 Native Tools Command Prompt for VS 2017(从开始菜单 > Visual Studio 2017 > Visual Studio Tools 启动)。
    • 进入 Protobuf 源码目录:
      cd C:\protobuf\protobuf-3.4.0
      mkdir build-vs2017
      cd build-vs2017
      
    • 使用 CMake 生成构建文件(Release 版本):
      cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ../cmake
      
    • 编译并安装:
      nmake
      nmake install
      
    • 编译完成后,Protobuf 的头文件和库文件将安装到 C:\protobuf\protobuf-3.4.0\build-vs2017\install
  3. 记录 Protobuf 路径

    • 头文件路径:C:\protobuf\protobuf-3.4.0\build-vs2017\install\include
    • 库文件路径:C:\protobuf\protobuf-3.4.0\build-vs2017\install\lib\libprotobuf.lib(Release 版本)或 libprotobufd.lib(Debug 版本)
    • 可执行文件:C:\protobuf\protobuf-3.4.0\build-vs2017\install\bin\protoc.exe
安装 Vulkan SDK(可选)

如果需要 Vulkan 支持(GPU 加速):

  1. 从 Vulkan SDK 官网 下载最新 Vulkan SDK(例如 VulkanSDK-1.3.x.x-Installer.exe)。
  2. 安装 Vulkan SDK,默认安装路径为 C:\VulkanSDK\1.3.x.x
  3. 配置环境变量:
    • 添加 VULKAN_SDK 环境变量,值为 C:\VulkanSDK\1.3.x.x
    • C:\VulkanSDK\1.3.x.x\Bin 添加到系统 PATH 环境变量。
  4. 确保显卡驱动支持 Vulkan(NVIDIA、AMD 或 Intel 显卡需更新到最新驱动)。
安装 OpenCV(可选)

如果需要处理图像数据:

  1. 从 OpenCV 官网 下载 OpenCV(推荐 3.4.12 或 4.x 版本)。
  2. 解压到本地目录,例如 C:\opencv\opencv-3.4.12
  3. 配置环境变量:
    • C:\opencv\opencv-3.4.12\build\x64\vc15\bin 添加到系统 PATH
  4. 记录 OpenCV 的头文件和库路径:
    • 头文件:C:\opencv\opencv-3.4.12\build\include
    • 库文件:C:\opencv\opencv-3.4.12\build\x64\vc15\lib\opencv_world3412.lib(Release 版本)或 opencv_world3412d.lib(Debug 版本)。
1.2 编译 ncnn
  1. 下载 ncnn 源码

    • 从 ncnn GitHub 下载源码并解压,例如到 C:\ncnn
    • 或者使用 Git 克隆:
      git clone https://github.com/Tencent/ncnn.git
      cd ncnn
      
  2. 创建构建目录

    • 在 ncnn 目录下创建构建文件夹:
      mkdir build-vs2017
      cd build-vs2017
      
  3. 使用 CMake 配置 ncnn

    • 打开 x64 Native Tools Command Prompt for VS 2017
    • 根据是否需要 Vulkan 支持,运行以下命令:
      • 不使用 Vulkan
        cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install ^
        -DProtobuf_INCLUDE_DIR=C:\protobuf\protobuf-3.4.0\build-vs2017\install\include ^
        -DProtobuf_LIBRARIES=C:\protobuf\protobuf-3.4.0\build-vs2017\install\lib\libprotobuf.lib ^
        -DProtobuf_PROTOC_EXECUTABLE=C:\protobuf\protobuf-3.4.0\build-vs2017\install\bin\protoc.exe ^
        -DNCNN_VULKAN=OFF ..
        
      • 使用 Vulkan
        cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install ^
        -DProtobuf_INCLUDE_DIR=C:\protobuf\protobuf-3.4.0\build-vs2017\install\include ^
        -DProtobuf_LIBRARIES=C:\protobuf\protobuf-3.4.0\build-vs2017\install\lib\libprotobuf.lib ^
        -DProtobuf_PROTOC_EXECUTABLE=C:\protobuf\protobuf-3.4.0\build-vs2017\install\bin\protoc.exe ^
        -DNCNN_VULKAN=ON ^
        -DVulkan_INCLUDE_DIR=C:\VulkanSDK\1.3.x.x\Include ^
        -DVulkan_LIBRARY=C:\VulkanSDK\1.3.x.x\Lib\vulkan-1.lib ..
        
      • Debug 版本:将 CMAKE_BUILD_TYPE=Release 改为 Debug,并将 libprotobuf.lib 替换为 libprotobufd.lib
  4. 编译并安装 ncnn

    nmake
    nmake install
    
    • 编译完成后,ncnn 的头文件和库文件将安装到 C:\ncnn\build-vs2017\install
    • 主要文件:
      • 头文件:C:\ncnn\build-vs2017\install\include\ncnn
      • 库文件:C:\ncnn\build-vs2017\install\lib\ncnn.lib(Release)或 ncnnd.lib(Debug)
      • CMake 配置文件:C:\ncnn\build-vs2017\install\lib\cmake\ncnn\ncnnConfig.cmake
  5. 验证编译结果

    • 确保 C:\ncnn\build-vs2017\install\include\ncnn\net.h 存在。
    • 确保 C:\ncnn\build-vs2017\install\lib\ncnn.lib(或 ncnnd.lib)存在。

步骤 2:配置 Visual Studio 2017 项目

在 Visual Studio 2017 中创建一个 C++ 项目(例如控制台应用程序),并配置以使用 ncnn 库。

2.1 创建项目
  1. 打开 Visual Studio 2017,选择 文件 > 新建 > 项目
  2. 选择 Visual C++ > Windows 桌面 > Windows 控制台应用程序,输入项目名称(例如 MyNcnnProject),点击确定。
  3. 确保项目配置为 x64 平台:
    • 解决方案资源管理器 中,右键点击项目,选择 属性
    • 配置管理器 中,将 活动解决方案平台 设置为 x64
2.2 配置项目属性

在项目属性中添加 ncnn 的头文件和库路径:

  1. 打开项目属性

    • 解决方案资源管理器 中,右键点击项目,选择 属性
  2. 添加包含目录

    • 转到 配置属性 > C/C++ > 常规
    • 附加包含目录 中添加以下路径:
      C:\ncnn\build-vs2017\install\include
      C:\protobuf\protobuf-3.4.0\build-vs2017\install\include
      
      如果使用 Vulkan,还需添加:
      C:\VulkanSDK\1.3.x.x\Include
      
      如果使用 OpenCV,还需添加:
      C:\opencv\opencv-3.4.12\build\include
      
  3. 添加库目录

    • 转到 配置属性 > 链接器 > 常规
    • 附加库目录 中添加:
      C:\ncnn\build-vs2017\install\lib
      C:\protobuf\protobuf-3.4.0\build-vs2017\install\lib
      
      如果使用 Vulkan,还需添加:
      C:\VulkanSDK\1.3.x.x\Lib
      
      如果使用 OpenCV,还需添加:
      C:\opencv\opencv-3.4.12\build\x64\vc15\lib
      
  4. 添加库依赖

    • 转到 配置属性 > 链接器 > 输入
    • 附加依赖项 中添加:
      • Release 版本:
        ncnn.lib
        libprotobuf.lib
        
        如果使用 Vulkan:
        vulkan-1.lib
        
        如果使用 OpenCV:
        opencv_world3412.lib
        
      • Debug 版本:
        ncnnd.lib
        libprotobufd.lib
        
        如果使用 Vulkan:
        vulkan-1.lib
        SPIRVd.lib
        glslangd.lib
        OGLCompilerd.lib
        OSDependentd.lib
        
        如果使用 OpenCV:
        opencv_world3412d.lib
        
  5. 确保运行时库一致

    • 转到 配置属性 > C/C++ > 代码生成
    • 设置 运行时库 为:
      • Release:多线程 DLL (/MD)
      • Debug:多线程调试 DLL (/MDd)
      • 确保与 ncnn 和 Protobuf 的编译选项一致(即使用 -Dprotobuf_MSVC_STATIC_RUNTIME=OFF)。
  6. 复制 DLL 文件(如果使用动态链接)

    • 如果 ncnn 或依赖库生成了动态库(.dll),需将相关 DLL 文件复制到项目输出目录(例如 MyNcnnProject\DebugMyNcnnProject\Release)。
    • 可能的 DLL 文件:
      • Protobuf:C:\protobuf\protobuf-3.4.0\build-vs2017\install\bin\libprotobuf.dll
      • Vulkan:C:\VulkanSDK\1.3.x.x\Bin\vulkan-1.dll
      • OpenCV:C:\opencv\opencv-3.4.12\build\x64\vc15\bin\opencv_world3412.dll
2.3 测试代码

在项目中创建一个简单的测试程序,验证 ncnn 是否正确配置。

  1. 在项目中添加一个 C++ 文件(例如 main.cpp),添加以下代码:

    #include <iostream>
    #include "ncnn/net.h"int main() {ncnn::Net net;std::cout << "ncnn version: " << ncnn::get_version_string() << std::endl;return 0;
    }
    
  2. 编译并运行

    • 选择 ReleaseDebug 配置,点击 生成 > 生成解决方案
    • 如果配置正确,程序将编译成功并输出 ncnn 的版本号。

步骤 3:使用 CMake 简化配置(可选)

如果你的项目使用 CMake 管理,可以通过 find_package 自动查找 ncnn。

  1. 创建 CMakeLists.txt
    在项目根目录创建 CMakeLists.txt

    cmake_minimum_required(VERSION 3.14)
    project(MyNcnnProject LANGUAGES CXX)set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)# 查找 ncnn
    set(ncnn_DIR "C:/ncnn/build-vs2017/install/lib/cmake/ncnn" CACHE PATH "Directory containing ncnnConfig.cmake")
    find_package(ncnn REQUIRED)# 添加可执行文件
    add_executable(MyNcnnProject main.cpp)# 链接 ncnn 库
    target_link_libraries(MyNcnnProject ncnn)
    
  2. 生成项目

    • 打开 x64 Native Tools Command Prompt for VS 2017
    • 进入项目目录,运行:
      mkdir build
      cd build
      cmake -G "Visual Studio 15 2017 Win64" ..
      
    • 打开生成的 .sln 文件,编译并运行。
  3. 验证

    • 确保 main.cpp 包含测试代码,编译后运行,检查是否输出 ncnn 版本。

常见问题及解决方法

  1. 错误:#include "ncnn/net.h" file not found

    • 确认 C:\ncnn\build-vs2017\install\include 已添加到 附加包含目录
    • 确认 ncnn 编译成功,net.h 存在于上述路径。
  2. 链接错误:LNK2019: unresolved external symbol

    • 确保 ncnn.lib(或 ncnnd.lib)已添加到 附加依赖项
    • 确认库路径正确,Release/Debug 配置一致。
    • 检查 Protobuf 和 Vulkan 的库是否正确链接。
  3. 运行时错误:无法找到 *.dll

    • 将必要的 DLL 文件(如 libprotobuf.dllvulkan-1.dll)复制到项目输出目录或添加到系统 PATH
  4. Vulkan 相关错误

    • 确保显卡驱动支持 Vulkan,Vulkan SDK 已正确安装。
    • 检查环境变量 VULKAN_SDK 是否设置正确。

参考资料

相关文章:

  • PostgreSQL架构
  • C语言入门
  • Vue3 Form 表单限制输入小写字母、数字和下划线
  • 使用VGG-16模型来对海贼王中的角色进行图像分类
  • 同源策略深度防御指南:CSP 高级应用与企业微信全场景适配(含 report-uri 实战)
  • 【产品经理从0到1】用户端产品设计与用户画像
  • 华三(H3C)IRF堆叠心跳的LACP MAD、BFD MAD和ARP MAD差异
  • HJ17 坐标移动【牛客网】
  • C++之set与map介绍
  • 《光与影:33号远征队》栩栩如生的角色动画是如何创建的?
  • vue+springboot+element-ui实现table的树懒加载
  • Redis学习专题(三)主从复制
  • Java大师成长计划之第28天:处理多线程的Web应用
  • python-数据可视化(大数据、数据分析、可视化图像、HTML页面)
  • 生产专属ERP系统源码,一套集成企业财务、供应链、生产、销售等核心业务流程的管理系统
  • 第三十天打卡
  • 【Java高阶面经】1.微服务架构核心:服务注册与发现之AP vs CP选型全攻略
  • 电子电器架构 --- 汽车高性能计算
  • 关于 APK 反编译与重构工具集
  • Spring Boot-Swagger离线文档(插件方式)
  • 美发布“金穹”导弹防御系统发展规划
  • 人民日报:莫让“假自杀”淹没“真求助”
  • 美国公布新型核弹B61-13,威力是广岛原子弹的21倍
  • 菲律宾华人“钢铁大王”撕票案两主谋被捕,部分赎金已被提取
  • 痴情与真爱
  • 达恩当选罗马尼亚总统