[分享] 《Cmake构建实战》5 onnxruntime手写识别实践(libpng引用失败)

maskmoo   2024-11-3 20:02 楼主

1 工程设计

设计目标

实现包括手写数字识别库以及一个识别命令行工具,识别库能够被C语言等其他编程语言所调用。

目录结构

├─cli
├─cmake
├─include
├─models
└─src

└─CMakeList.txt

接口设计

  • 初始化手写数字识别库  NUM_RECOGNIZER_EXPORT void num_recognizer_init();
  • 识别器创建   NUM_RECOGNIZER_EXPORT void num_recognizer_create(const char *model_path,  Recognizer **out_recognizer);

  • 析构识别器   NUM_RECOGNIZER_EXPORT void num_recognizer_delete(Recognizer *recognizer);

  • 识别图片  NUM_RECOGNIZER_EXPORT int num_recognizer_recognize_png(Recognizer *recognizer,   const char *png_path,  int *result);

 

2 安装依赖库

第3方库的依赖主要包含有libpng,zlib以及onnxruntime。

onnxruntime安装:

《Cmake构建实战》4 onnxruntime的查找模块实践

zlib安装

Release zlib 1.3.1 · madler/zlib · GitHub

cd zlib
mkdir build
cd build

cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build . --config Release

#需要管理员权限 默认安装路径 C:\Program Files(x86)\zlib
cmake --install .  

image.png  

 

libpng安装

需要先安装zib

Release v1.6.40 · pnggroup/libpng · GitHub

cd libpng
mkdir build
cd build

cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build . --config Release

#需要管理员权限 默认安装路径 C:\Program Files(x86)\libpng
cmake --install . 

image.png  

 

Cmake导入脚本

#[=======================================================================[.rst:
Findlibpng
-------

Finds the libpng library.(查找libpng库)

Imported Targets(导入目标)
^^^^^^^^^^^^^^^^^^^^^^^^^^

This module provides the following imported targets, if found(若查找成功,该模块会创建如下导入目标):

``png_shared``
  The libpng shared library(libpng动态库)
``png_static``
  The libpng static library(libpng静态库)

Result Variables(结果变量)
^^^^^^^^^^^^^^^^^^^^^^^^^^

This will define the following variables(该模块会定义如下变量):

``libpng_FOUND``
  True if the system has the libpng library.(若成功查找libpng库,则为真值)
``libpng_INCLUDE_DIRS``
  Include directories needed to use libpng.(作为使用要求的libpng的头文件目录)
``libpng_LIBRARIES``
  Libraries needed to link to libpng shared library.(作为使用要求的libpng的动态链接库文件路径)

Cache Variables(缓存变量)
^^^^^^^^^^^^^^^^^^^^^^^^^

The following cache variables may also be set(该模块会定义如下缓存变量):

``libpng_INCLUDE_DIR``
  The directory containing ``png.h``.(``png.h``所在目录)
#]=======================================================================]

# 调用libpng库自带的配置文件来查找软件包,其自带配置文件会创建两个导入库目标:
# 1. 动态库导入目标``png_shared``
# 2. 静态库导入目标``png_static``
find_package(libpng CONFIG CONFIGS libpng16.cmake)

# 若成功查找,为两个库目标补上缺失的头文件目录属性
if(libpng_FOUND)
  # 获取png动态库导入目标对应动态库文件的路径,首先尝试其IMPORTED_LOCATION属性
  get_target_property(libpng_LIBRARY png_shared IMPORTED_LOCATION)
  # 若未能获得动态库文件路径,再尝试其IMPORTED_LOCATION_RELEASE属性
  if(NOT libpng_LIBRARY)
    get_target_property(libpng_LIBRARY png_shared IMPORTED_LOCATION_RELEASE)
  endif()
  # 根据png动态库的路径,设置libpng的根目录
  set(_png_root "${libpng_LIBRARY}/../..")

  # 查找png.h头文件所在目录的路径
  find_path(libpng_INCLUDE_DIR png.h
    HINTS ${_png_root}
    PATH_SUFFIXES include)
  # 为png和png_static导入库目标设置头文件目录属性
  target_include_directories(png_shared INTERFACE ${libpng_INCLUDE_DIR})
  target_include_directories(png_static INTERFACE ${libpng_INCLUDE_DIR})
endif()

include(FindPackageHandleStandardArgs)

# 检查变量是否有效以及配置文件是否成功执行
find_package_handle_standard_args(libpng 
  REQUIRED_VARS libpng_LIBRARY libpng_INCLUDE_DIR
  CONFIG_MODE)

# 若一切成功,设置结果变量
if(libpng_FOUND)
  set(libpng_INCLUDE_DIRS ${libpng_INCLUDE_DIR})
  set(libpng_LIBRARIES ${libpng_LIBRARY})
endif()

 

构建和运行

cd ch011
mkdir build
cd build

cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug 

 

最终编译失败,提示找不到png_shared。但是查看安装目录也可以看到目标png_shared的IMPORTED_LOCATION_RELEASE属性。有了解错误原因的大佬帮忙指导一下。

image.png  

 

image.png  

本帖最后由 maskmoo 于 2024-11-3 20:02 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复