libctk shared library的设计及编码实践记录

一、引言

1.1 <libctk>的由来

1.2 <libctk>的设计理论依据

1.3 <libctk>的设计理念

二、<libctk>的依赖库

三、<libctk>的目录说明

四、<libctk>的功能模块及使用实例说明

4.1 日志模块
4.2 mysql client模块
4.3 ftp client模块
4.4 cv人脸检测与识别模块

五、下一步计划

5.1 后续版本规划

5.2 编写SDK

5.3 开源计划

一、引言
1.1 <libctk>的由来

       设计初衷是作为<Smart-park-FaceDR-SVC>项目的辅助项目,个中缘由可查阅:智慧园区项目人脸检测与识别子项目之-总体设计

       实际上,<libctk>发展到现在,已经完全独立于<Smart-park-FaceDR-SVC>项目,已经完完全全是linux下的一个shared library。
https://mp.csdn.net/mp_blog/creation/editor/139818825
1.2 <libctk>的设计理论依据:

      笔者为了为本文作铺垫,专门在之前编写了:linux下的动态链接库的编码实现。

      本文就不再描述<shared library>理论上的说明,一句话"干就完事!"(码农最喜欢的就是实操)。


1.3 <libctk>的设计理念

(1) 不重复造轮子

       利用现有的开源库来避免重复造轮子,提高开发效率和代码质量。同时,通过学习这些开源库的源代码,提升自己的编程技能和代码水平。

(2) 优雅、简洁、易用

       优雅:共享库的设计应该优雅简洁,遵循UNIX哲学,即"简单就是美"。避免过分复杂的设计,保持功能的简洁性和易懂性。

       简洁:共享库应该提供清晰简洁的接口,尽量少暴露内部实现细节,使用户可以方便地调用库的功能,而不需要了解其具体实现。

       易用:共享库应该易于安装、配置和使用,提供简单的API和文档,使用户能够快速上手并应用库的功能。

        总的来说,Linux下共享库的设计应该遵循优雅、简洁、易用的原则,以提高代码的可维护性和可扩展性,同时提供良好的用户体验,让用户能够方便地使用和扩展库的功能。

二、<libctk>的依赖库

库名称说明
libconfig++libconfig++是一个C++版本的libconfig配置文件解析库。在Linux系统上,可以使用libconfig++库来方便地读取和修改配置文件,从而实现程序的灵活配置和参数设置。
spdlogspdlog是一个快速、可扩展的C++日志记录库,提供了多种日志记录方式和格式化选项。它支持多线程并发日志记录,可以轻松地集成到各种应用程序中。
MySQL  Connector/C++MySQL官方提供的C++库,用于在Linux系统上连接和操作MySQL数据库。需要在官网上下载对应OS版本的安装包。
libcurl-devlibcurl-dev  是用于 Linux 系统的 libcurl 的开发包,用于编译和链接程序需要使用  libcurl  库的程序。通过安装  libcurl-dev,开发人员可以在其代码中使用  libcurl  的功能,如  HTTP  请求、FTP  传输等等。
opencv4.9是一个开源的计算机视觉库,提供了很多计算机视觉和图像处理的功能,如图像处理、目标识别、特征检测等。OpenCV库可以在Linux下使用,并且提供了很多用于C++、Python和Java等编程语言的接口。

特别说明:以上库,笔者全部选择下载源码编译安装(从版本、个性化方面考虑)。当然,你也可选择apt-get方式安装。至于编译安装方法,你可以自行摆渡,也可以在笔者的博文中查找相关文章。

三、<libctk>的目录及CMakeList.txt文件说明

<libctk>的clion-IDE界面:

大概的目录结构是这样的:

libctk
│-- cmake
├-- conf 
│-- include
|-----ctk
|-------cvFace.h
|-------cvUtils.h
|-------error.h
|-- onnx
├── src
│   ├── cvFace.cpp
│   ├── cvUtils.cpp
│   ├── error.cpp
│   └── ...
│-- build
└── CMakeList.txt

目录说明:

目录说明
cmake.cmake文件的存放路径。如:FindOpencv.cmake、utils.cmake
conf配置文件的存放路径。如:log.conf,mysql.conf,faceDR.conf
include/ctk头文件的存放路径。
onnx存放<物体检测>的训练模型文件(ONNX文件)
srcc++源代码文件的存放路径。
CMakeList.txt不用说明吧。

CMakeList.txt:

# ----------------------------------------------------------------------------
#  Root CMake file for libctk
#
#    From the off-tree build directory, invoke:
#      $ cmake <PATH_TO_CTK_ROOT>
#  Author: RemonLin
# ----------------------------------------------------------------------------
# Disable in-source builds to prevent source tree corruption.
if(" ${CMAKE_SOURCE_DIR}" STREQUAL " ${CMAKE_BINARY_DIR}")message(FATAL_ERROR "
FATAL: In-source builds are not allowed.You should create a separate directory for build files.
")
endif()list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
# message(STATUS "cmake_module_path is: ${CMAKE_MODULE_PATH}")
include(DepVersions)#cmake_minimum_required(VERSION "${MIN_VER_CMAKE}" FATAL_ERROR)
cmake_minimum_required(VERSION 3.21..3.29 FATAL_ERROR)# ---------------------------------------------------------------------------------------
# Start ctk project
# ---------------------------------------------------------------------------------------
include(cmake/utils.cmake)
ctk_extract_version()
message(STATUS "Build libctk: ${CTK_VERSION}")project(ctk VERSION ${CTK_VERSION} LANGUAGES CXX)
# ---------------------------------------------------------------------------------------
# Dependencies
# ---------------------------------------------------------------------------------------
# Find libconfig++
# find_package(libconfig ${LIBCONFIG_VERSION} REQUIRED HINTS ${LIBCONFIG_INSTALLATION_PATH})
# Find spdlog 1.13.0
include(Findspdlog)
find_package(spdlog ${SPDLOG_VERSION} REQUIRED HINTS ${SPDLOG_INSTALLATION_PATH})# Find OpenCV
include(FindOpenCV)
find_package(OpenCV ${OPENCV_VERSION} REQUIRED HINTS ${OPENCV_INSTALLATION_PATH})# Find CURL
include(FindCURL)
find_package(CURL REQUIRED)# must go before the project()/enable_language() commands
ctk_update(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configs" FO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/37868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发设备管理:【@ohos.geolocation (位置服务)】

位置服务 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import geolocation from ohos.geolocation;geolocation.on(‘locationChange’) on(type: ‘locationChange’, request: L…

安卓开发自定义时间日期显示组件

安卓开发自定义时间日期显示组件 问题背景 实现时间和日期显示&#xff0c;左对齐和对齐两种效果&#xff0c;如下图所示&#xff1a; 问题分析 自定义view实现一般思路&#xff1a; &#xff08;1&#xff09;自定义一个View &#xff08;2&#xff09;编写values/attrs.…

poi-tl 生成 word 文件(插入文字、图片、表格、图表)

文章说明 本篇文章主要通过代码案例的方式&#xff0c;展示 poi-tl 生成 docx 文件的一些常用操作&#xff0c;主要涵盖以下内容 &#xff1a; 插入文本字符&#xff08;含样式、超链接&#xff09;插入图片插入表格引入标签&#xff08;通过可选文字的方式&#xff0c;这种方…

大模型和数据库最新结合进展

写在前面 本文主要内容是上次接受 infoQ 访谈&#xff0c;百度智能云朱洁老师介绍了大模型和 AI 结合相关话题&#xff0c;这次整体再刷新下&#xff0c;给到对这个领域感兴趣的同学。 当前&#xff0c;百度智能云云数据库特惠专场开始&#xff01;热销规格新用户免费使用&am…

最逼真的简易交通灯设计

最逼真的简易交通灯设计 需要资料的请在文章末尾获取&#xff08;有问题可以私信我哦~~&#xff09; 01 资料内容 Proteus仿真文件程序源码实物制作&#xff0c;代码修改&#xff0c;功能定制&#xff08;需额外收费&#xff0c;价格实惠&#xff0c;欢迎咨询&#xff09; …

实验场:在几分钟内使用 Elasticsearch 进行 RAG 应用程序实验

作者&#xff1a;来自 Elastic Joe McElroy, Serena Chou 什么是 Playground&#xff08;实验场&#xff09;&#xff1f; 我们很高兴发布我们的 Playground 体验 —- 一个低代码界面&#xff0c;开发人员可以在几分钟内使用自己的私人数据探索他们选择的 LLM。 在对对话式搜…

41割队伍

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/387 题目描述 给定 𝑛n 个数字 𝑎1,�…

Hi3861 OpenHarmony嵌入式应用入门--LiteOS Semaphore做同步使用

信号量作为同步使用 创建一个Semaphore对象&#xff0c;并指定一个初始的计数值&#xff08;通常称为“许可”或“令牌”的数量&#xff09;。这个计数值表示当前可用的资源数量或可以同时访问共享资源的线程数。当一个线程需要访问共享资源时&#xff0c;它会尝试从Semaphore…

加油站可视化:打造智能化运营与管理新模式

智慧加油站可视化通过图扑 HT 构建仿真的三维模型&#xff0c;将加油站的布局、设备状态、人员活动等信息动态呈现。管理者可以通过直观的可视化界面实时监控和分析运营状况&#xff0c;快速做出决策&#xff0c;提高管理效率和安全水平&#xff0c;推动加油站向智能化管理转型…

后端之路第三站(Mybatis)——结合案例讲Mybatis怎么操作sql

先讲一下准备工作整体流程要做什么 我们要基于一个员工管理系统作为案例&#xff0c;进行员工信息的【增、删、改、查】 原理就是用Mybatis通过java语言来执行sql语句&#xff0c;来达到【增、删、改、查】 一、准备工作 1、引入数据库数据 首先我们把一个员工、部门表的数…

【51单片机入门】速通定时器

文章目录 前言定时器是什么初始化定时器初始化的大概步骤TMOD寄存器C/T寄存器 触发定时器中断是什么中断函数定时器点亮led 总结 前言 在嵌入式系统的开发中&#xff0c;定时器是一个非常重要的组成部分。它们可以用于产生精确的时间延迟&#xff0c;或者在特定的时间间隔内触…

Java--常用类APl(复习总结)

前言: Java是一种强大而灵活的编程语言&#xff0c;具有广泛的应用范围&#xff0c;从桌面应用程序到企业级应用程序都能够使用Java进行开发。在Java的编程过程中&#xff0c;使用标准类库是非常重要的&#xff0c;因为标准类库提供了丰富的类和API&#xff0c;可以简化开发过…

【接口自动化测试】第三节.实现项目核心业务接口自动化

文章目录 前言一、实现登录接口对象封装和调用 1.0 登录接口的接口测试文档 1.1 接口对象层&#xff08;封装&#xff09; 1.2 测试脚本层&#xff08;调用&#xff09;二、课程新增接口对象封装和调用 2.0 课程新增接口的接口测试文档 2.1 接口对象层…

AVL树模拟

1.概念 虽然二叉搜索树可以缩短查找的效率&#xff0c;但如果数据有序或者接近有序时二叉搜索树树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。AVL 树是具有一下性质的二叉搜索树&#xff1a; 1.它的左右子树都是AVL树 2.左右子…

Mac 如何安装 wget

1.安装 Homebrew2.安装 wget3.检测 wget 是否安装成功 1.安装 Homebrew 在安装 wget 之前需要安装一个适用于 mac 的包管理器 Homebrew&#xff0c;打开 mac 终端执行如下命令进行安装&#xff1a; /usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/h…

新手第一个漏洞复现:MS17-010(永恒之蓝)

文章目录 漏洞原理漏洞影响范围复现环境复现步骤 漏洞原理 漏洞出现在Windows SMB v1中的内核态函数srv!SrvOs2FeaListToNt在处理FEA&#xff08;File Extended Attributes&#xff09;转换时。该函数在将FEA list转换成NTFEA&#xff08;Windows NT FEA&#xff09;list前&am…

【Golang - 90天从新手到大师】Day14 - 方法和接口

一&#xff0e; go方法 go方法&#xff1a;在函数的func和函数名间增加一个特殊的接收器类型&#xff0c;接收器可以是结构体类型或非结构体类型。接收器可以在方法内部访问。创建一个接收器类型为Type的methodName方法。 func (t Type) methodName(parameter list) {}go引入…

解决“Duplicate keys detected: ‘ ‘.This may cause an update error.”问题

问题原因 出现“Duplicate keys detected”的错误&#xff0c;通常表示在v-for指令中使的:key绑定值有重复。 如果前端是静态数据&#xff0c;一般能自我避免:key绑定值有重复。如果前端是绑定的动态数据&#xff0c;那么需要另外提供一个唯一的键。 在这个例子中&#xff0c…

【LeetCode】接雨水

目录 一、题目二、解法完整代码 一、题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff…

【UML用户指南】-23-对高级行为建模-状态机

目录 1、概述 2、状态 2.1、状态的组成 3、转移 3.1、转移的组成 4、高级状态和转移 4.1、进入效应和退出效应 4.2、内部转移 4.3、do活动 4.4、延迟事件 4.5、子状态机 5、子状态 5.1、非正交子状态 5.2、历史状态 5.3、正交子状态 6、分叉与汇合 7、主动对象…