• Win 下 ncnn 编译运行


    ncnn

    官网上编译的过程比较详细,本文主要记录编译、运行过程中遇到的问题,希望可以帮到大家。

    我的环境是 Win10 系统,VS 2022。

    编译

    先使用如下命令获取 ncnn 代码库:

    git clone https://github.com/Tencent/ncnn.git
    cd ncnn
    git submodule update --init
    
    • 1
    • 2
    • 3

    点击链接 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    cmake --build . --config Release -j 2 就是编译代码,2 是编译时使用的核数,可以根据自己 CPU 情况适当修改。

    cmake --build . --config Release --target install 会将头文件、库文件放到当前目录的 install 目录下,后续编译代码设置头文件、库文件位置时就是这里。

    构建 ncnn library(需要将 替换成你自己的目录):

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行

    博主不会深度学习,示例代码仅代表能用 ncnn 库的东西。

    #include "net.h"
    
    int main() {
    	ncnn::Net net;
    	
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    下面是遇到的一些问题及解决方案:

    代码说明
    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 有关的库都添加到「附加依赖项」中。可是还是没有解决该问题,在将该目录下所有库文件都添加进去即可解决。

  • 相关阅读:
    STM32物联网项目-RTC时钟
    30条电商客服话术,快收好!
    线性同余方程(扩展欧几里得acwing878)
    this的指向
    fastadmin 操作栏按钮打开其他控制页面
    安防行业经销商渠道管理系统:完善经销商管控,助力企业做好渠道管理
    面试官:如何提升应用的 Lighthouse 分数
    [算法刷题笔记]哈希表(1)
    K8S之使用Deployment实现滚动更新
    virtio-net 报文组织形式
  • 原文地址:https://blog.csdn.net/qq_40080842/article/details/138163282