ncnn
官网上编译的过程比较详细,本文主要记录编译、运行过程中遇到的问题,希望可以帮到大家。
我的环境是 Win10 系统,VS 2022。
编译
先使用如下命令获取 ncnn 代码库:
git clone https://github.com/Tencent/ncnn.git
cd ncnn
git submodule update --init
点击链接 protobuf-3.11.2 下载 protobuf。
构建 protobuf library:
首先打开 VS 2022 的命令行,后续命令都在这里面进行。
一定要记得自己使用的是 x64 还是 x86,后续项目要使用相同版本。
cd <protobuf-root-dir>
mkdir protobuf_build
cd protobuf_build
cmake -A x64 -DCMAKE_INSTALL_PREFIX=%cd%/install -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ../cmake
cmake --build . --config Release -j 2
cmake --build . --config Release --target install
cmake --build . --config Release -j 2
就是编译代码,2 是编译时使用的核数,可以根据自己 CPU 情况适当修改。
cmake --build . --config Release --target install
会将头文件、库文件放到当前目录的 install 目录下,后续编译代码设置头文件、库文件位置时就是这里。
构建 ncnn library(需要将 <protobuf-root-dir>
替换成你自己的目录):
cd <ncnn-root-dir>
mkdir protobuf_build
cd protobuf_build
cmake -A x64 -DCMAKE_INSTALL_PREFIX=%cd%/install -Dprotobuf_DIR=<protobuf-root-dir>/protobuf_build/install/cmake -DNCNN_VULKAN=ON ..
cmake --build . --config Release -j 2
cmake --build . --config Release --target install
运行
博主不会深度学习,示例代码仅代表能用 ncnn 库的东西。
#include "net.h"int main() {ncnn::Net net;return 0;
}
下面是遇到的一些问题及解决方案:
代码 | 说明 |
---|---|
E1696 | 无法打开源文件 “net.h” |
C1083 | 无法打开包括文件: “net.h”: No such file or directory |
这个问题说的是找不到头文件,我们需要设置 VS 搜索头文件的路径。
右键项目 -> 属性 -> 配置属性 -> VC++ 目录 -> 包含目录
在包含目录中添加 ncnn 头文件的目录路径(…\install\include\ncnn)。
代码 | 说明 |
---|---|
LNK2019 | 无法解析的外部符号 “public: __cdecl ncnn::Net::Net(void)”,函数 main 中引用了符号 |
这个是因为编译器找不到相应的实现,我们需要设置库路径和使用到的库。
右键项目 -> 属性 -> 配置属性 -> VC++ 目录 -> 库目录 添加库文件路径
右键项目 -> 属性 -> 链接器 -> 输入 -> 附加依赖项 添加 ncnn.lib
代码 | 说明 |
---|---|
LNK2038 | 检测到 “_ITERATOR_DEBUG_LEVEL” 的不匹配项:值 0 不匹配值 2 |
LNK2038 | 检测到 “RuntimeLibrary” 的不匹配项: 值 MD_DynamicRelease 不匹配值 MDd_DynamicDebug |
这是因为项目是 Debug 版本,而我们编译的 ncnn 为 Release 版本。将项目版本切换与 ncnn 相同即可。
代码 | 说明 |
---|---|
LNK2001 | 无法解析的外部符号 “bool __cdecl glslang::InitializaProcess(void)” |
这个问题看起来与上面遇到的问题相似,于是我们在:
右键项目 -> 属性 -> 链接器 -> 输入 -> 附加依赖项
中将 …\install\lib 目录下 glslang 有关的库都添加到「附加依赖项」中。可是还是没有解决该问题,在将该目录下所有库文件都添加进去即可解决。