vs2017编译ncnn库
在 Windows 环境下,使用 Visual Studio 2017 配置 ncnn 库并在项目中包含 #include "ncnn/net.h"
,需要完成 ncnn 的编译和项目配置。以下是详细的步骤指南,确保环境配置正确,并成功链接 ncnn 库。
前提条件
- 已安装 Visual Studio 2017:确保安装了 Visual Studio 2017 Community 或其他版本,并包含 C++ 桌面开发工作负载(包括 MSVC 编译器和 CMake 工具)。
- 已安装 CMake:推荐使用 CMake 3.14 或更高版本,用于生成 ncnn 的构建文件。可以在 CMake 官网 下载安装。
- 已下载 ncnn 源码:从 Tencent/ncnn GitHub 仓库 下载最新 ncnn 源码(建议使用最新 release 或 master 分支)。
- 可选:支持 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
-
下载 Protobuf 源码:
- 访问 Protobuf GitHub 仓库 下载源码(推荐 v3.4.0 或更高版本)。
- 解压到本地目录,例如
C:\protobuf\protobuf-3.4.0
。
-
编译 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
。
-
记录 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 加速):
- 从 Vulkan SDK 官网 下载最新 Vulkan SDK(例如 VulkanSDK-1.3.x.x-Installer.exe)。
- 安装 Vulkan SDK,默认安装路径为
C:\VulkanSDK\1.3.x.x
。 - 配置环境变量:
- 添加
VULKAN_SDK
环境变量,值为C:\VulkanSDK\1.3.x.x
。 - 将
C:\VulkanSDK\1.3.x.x\Bin
添加到系统PATH
环境变量。
- 添加
- 确保显卡驱动支持 Vulkan(NVIDIA、AMD 或 Intel 显卡需更新到最新驱动)。
安装 OpenCV(可选)
如果需要处理图像数据:
- 从 OpenCV 官网 下载 OpenCV(推荐 3.4.12 或 4.x 版本)。
- 解压到本地目录,例如
C:\opencv\opencv-3.4.12
。 - 配置环境变量:
- 将
C:\opencv\opencv-3.4.12\build\x64\vc15\bin
添加到系统PATH
。
- 将
- 记录 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
-
下载 ncnn 源码:
- 从 ncnn GitHub 下载源码并解压,例如到
C:\ncnn
。 - 或者使用 Git 克隆:
git clone https://github.com/Tencent/ncnn.git cd ncnn
- 从 ncnn GitHub 下载源码并解压,例如到
-
创建构建目录:
- 在 ncnn 目录下创建构建文件夹:
mkdir build-vs2017 cd build-vs2017
- 在 ncnn 目录下创建构建文件夹:
-
使用 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
。
- 不使用 Vulkan:
-
编译并安装 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
- 头文件:
- 编译完成后,ncnn 的头文件和库文件将安装到
-
验证编译结果:
- 确保
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 创建项目
- 打开 Visual Studio 2017,选择 文件 > 新建 > 项目。
- 选择 Visual C++ > Windows 桌面 > Windows 控制台应用程序,输入项目名称(例如
MyNcnnProject
),点击确定。 - 确保项目配置为 x64 平台:
- 在 解决方案资源管理器 中,右键点击项目,选择 属性。
- 在 配置管理器 中,将 活动解决方案平台 设置为 x64。
2.2 配置项目属性
在项目属性中添加 ncnn 的头文件和库路径:
-
打开项目属性:
- 在 解决方案资源管理器 中,右键点击项目,选择 属性。
-
添加包含目录:
- 转到 配置属性 > C/C++ > 常规。
- 在 附加包含目录 中添加以下路径:
如果使用 Vulkan,还需添加:C:\ncnn\build-vs2017\install\include C:\protobuf\protobuf-3.4.0\build-vs2017\install\include
如果使用 OpenCV,还需添加:C:\VulkanSDK\1.3.x.x\Include
C:\opencv\opencv-3.4.12\build\include
-
添加库目录:
- 转到 配置属性 > 链接器 > 常规。
- 在 附加库目录 中添加:
如果使用 Vulkan,还需添加:C:\ncnn\build-vs2017\install\lib C:\protobuf\protobuf-3.4.0\build-vs2017\install\lib
如果使用 OpenCV,还需添加:C:\VulkanSDK\1.3.x.x\Lib
C:\opencv\opencv-3.4.12\build\x64\vc15\lib
-
添加库依赖:
- 转到 配置属性 > 链接器 > 输入。
- 在 附加依赖项 中添加:
- Release 版本:
如果使用 Vulkan:ncnn.lib libprotobuf.lib
如果使用 OpenCV:vulkan-1.lib
opencv_world3412.lib
- Debug 版本:
如果使用 Vulkan:ncnnd.lib libprotobufd.lib
如果使用 OpenCV:vulkan-1.lib SPIRVd.lib glslangd.lib OGLCompilerd.lib OSDependentd.lib
opencv_world3412d.lib
- Release 版本:
-
确保运行时库一致:
- 转到 配置属性 > C/C++ > 代码生成。
- 设置 运行时库 为:
- Release:
多线程 DLL (/MD)
- Debug:
多线程调试 DLL (/MDd)
- 确保与 ncnn 和 Protobuf 的编译选项一致(即使用
-Dprotobuf_MSVC_STATIC_RUNTIME=OFF
)。
- Release:
-
复制 DLL 文件(如果使用动态链接):
- 如果 ncnn 或依赖库生成了动态库(
.dll
),需将相关 DLL 文件复制到项目输出目录(例如MyNcnnProject\Debug
或MyNcnnProject\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
- Protobuf:
- 如果 ncnn 或依赖库生成了动态库(
2.3 测试代码
在项目中创建一个简单的测试程序,验证 ncnn 是否正确配置。
-
在项目中添加一个 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; }
-
编译并运行:
- 选择 Release 或 Debug 配置,点击 生成 > 生成解决方案。
- 如果配置正确,程序将编译成功并输出 ncnn 的版本号。
步骤 3:使用 CMake 简化配置(可选)
如果你的项目使用 CMake 管理,可以通过 find_package
自动查找 ncnn。
-
创建 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)
-
生成项目:
- 打开 x64 Native Tools Command Prompt for VS 2017。
- 进入项目目录,运行:
mkdir build cd build cmake -G "Visual Studio 15 2017 Win64" ..
- 打开生成的
.sln
文件,编译并运行。
-
验证:
- 确保
main.cpp
包含测试代码,编译后运行,检查是否输出 ncnn 版本。
- 确保
常见问题及解决方法
-
错误:
#include "ncnn/net.h" file not found
:- 确认
C:\ncnn\build-vs2017\install\include
已添加到 附加包含目录。 - 确认 ncnn 编译成功,
net.h
存在于上述路径。
- 确认
-
链接错误:
LNK2019: unresolved external symbol
:- 确保
ncnn.lib
(或ncnnd.lib
)已添加到 附加依赖项。 - 确认库路径正确,Release/Debug 配置一致。
- 检查 Protobuf 和 Vulkan 的库是否正确链接。
- 确保
-
运行时错误:
无法找到 *.dll
:- 将必要的 DLL 文件(如
libprotobuf.dll
、vulkan-1.dll
)复制到项目输出目录或添加到系统PATH
。
- 将必要的 DLL 文件(如
-
Vulkan 相关错误:
- 确保显卡驱动支持 Vulkan,Vulkan SDK 已正确安装。
- 检查环境变量
VULKAN_SDK
是否设置正确。
参考资料
- ncnn 官方编译指南:https://github.com/Tencent/ncnn/wiki/how-to-build#build-for-windows-x64-using-visual-studio-community-2017
- Protobuf 编译:https://github.com/protocolbuffers/protobuf
- Vulkan SDK:https://vulkan.lunarg.com/sdk/home
- Visual Studio 项目配置:https://learn.microsoft.com/en-us/cpp/build/how-to-set-up-visual-cpp-projects?view=msvc-170