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++库来方便地读取和修改配置文件,从而实现程序的灵活配置和参数设置。 |
| spdlog | spdlog是一个快速、可扩展的C++日志记录库,提供了多种日志记录方式和格式化选项。它支持多线程并发日志记录,可以轻松地集成到各种应用程序中。 |
| MySQL Connector/C++ | MySQL官方提供的C++库,用于在Linux系统上连接和操作MySQL数据库。需要在官网上下载对应OS版本的安装包。 |
| libcurl-dev | libcurl-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文件) |
| src | c++源代码文件的存放路径。 |
| 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相关文章:
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…...
【代码随想录训练营】【Day 65】【图论-2】| 卡码 99
【代码随想录训练营】【Day 65】【图论-2】| 卡码 99 需强化知识点 深度搜索和广度搜索 题目 99. 岛屿数量 思想:遍历到为1的节点,再搜索标记,每遇到新的陆地节点,增加计数 深度搜索广度搜索:此处用 [] 作为待遍…...
【动态规划】139. 单词拆分
139. 单词拆分 难度:中等 力扣地址:https://leetcode.cn/problems/word-break/description/ 问题描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意:不要求字…...
【C++】空指针访问成员函数
空指针访问成员函数 C中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针 如果用到this指针,需要加以判断保证代码的健壮性 class Animal { public:void fun1() {//正常的成员函数}void fun2() {if (this NULL) {return;//如果没有这个…...
Linux的IO易错点总结
本文主要记录IO的一些易错操作。 阻塞IO和非阻塞IO,一般都是针对数据读取的,因为write是主动行为,不存在阻塞这一说。 非阻塞式IO,一般都要配合while轮询来读取数据。 IO多路复用 当只检测一路IO的时候,和普通IO的作…...
【Android面试八股文】说一说你对Android中的Context的理解吧
文章目录 一、Context是什么?1.1 主要功能和用途1.2 如何获取 Context 实例?1.3 注意事项二、Context 类的层次结构三、Context的数量四、Context的注意事项五、Android 中有多少类型的 Context,它们有什么区别 ?六、Contextlmpl实例是什么时候生成的,在 Activity 的 oncr…...
AI在音乐创作中的角色:创造还是毁灭?
目录 一、基本情况介绍 二、近期新闻 三、AI生成音乐方面的商业模式 四、人工智能和音乐人可能的合作模式 五、人们如何借助AI来创作音乐 六、人工智能在创意产业引发的伦理道德问题 七、如何平衡技术发展与提高人类创造积极性的关系? 总结 一、基本情况介绍…...
[深入理解DDR] 总目录
依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR》 蓝色的是传送门,点击链接即可到达指定文章。 图。 DDR 分类 导论 [RAM] DRAM 导论:DDR4 | DDR5 | LPDDR5 | GDRR6 | HBM 应运而生 运存与内存?内存与存…...
模板方法模式在金融业务中的应用及其框架实现
引言 模板方法模式(Template Method Pattern)是一种行为设计模式,它在一个方法中定义一个算法的框架,而将一些步骤的实现延迟到子类中。模板方法允许子类在不改变算法结构的情况下重新定义算法的某些步骤。在金融业务中ÿ…...
leetcode347.前k个高频元素
leetcode347.前k个高频元素 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2] 示例 2: 输入: nums [1], k 1 输出: [1] 优先队列法 struct hash_…...
c++(二)
1. 类和对象 1.1. 封装 封装的意义 将属性和行为作为一个整体,表现生活中的事物;将属性和行为加以权限控制 public -> 公共权限:类内可以访问,类外也可以访问protected -> 保护权限:类内可以访问,…...
基于PHP的初中数学题库管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的初中数学题库管理系统 一 介绍 此初中数学题库管理系统基于原生PHP开发,数据库mysql,系统角色分为学生,教师和管理员。(附带参考设计文档) 技术栈:phpmysqlphpstudyvscode 二 功能 …...
WDG看门狗
1 WDG 1.1 简介 WDG是看门狗定时器(Watchdog Timer)的缩写,它是一种用于计算机和嵌入式系统中的定时器,用来检测和恢复系统故障。 看门狗就像是一个忠诚的宠物狗,它时刻盯着你的程序,确保它们正常运行。…...
zabbix server client 安装配置
Zabbix Server 采用源码包部署,数据库采用 MySQL8.0 版本,zabbix-web 使用 nginxphp 来实现。具体信息如下: 软件名 版本 安装方式 Zabbix Server 6.0.3 源码安装 Zabbix Agent 6.0.3 源码安装 MySQL 8.0.28 yum安装 Nginx 1.20…...
Unity关于Addressables.Release释放资源内存问题
前言 最近在编写基于Addressables的资源管理器,对于资源释放模块配合MemoryProfiler进行了测试,下面总结下测试Addressables.Release的结论。 总结 使用Addressables.Release释放资源时,通过MemoryProfiler检查内存信息发现加载的内容还在…...
运算放大器(运放)带宽和带宽平坦度
运算放大器带宽和带宽平坦度 电压反馈型运算放大器的带宽 下图1显示电压反馈型运算放大器的开环频率响应。有两种可能:图1A是最常见的情况,高直流增益以6dB/倍频程从极低频率下降至单位增益,也就是典型的单极点响应。相比之下,图…...
npm常用命令使用与事件案例
概述 npm(Node Package Manager)是一个JavaScript编程语言的包管理器,用于Node.js应用程序。它允许用户安装、共享和管理具有重复使用价值的代码(包),这些代码可以是库、工具或应用程序。 npm常用命令详解…...
Spring Boot中的定时任务调度
Spring Boot中的定时任务调度 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨如何在Spring Boot应用中实现定时任务调度,这在实际…...
Hadoop3:MapReduce中的ETL(数据清洗)
一、概念说明 “ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程。ETL一词较常用在数据仓库&#…...
python解锁图片相似度的神奇力量
在这个信息爆炸的时代,图片成为了我们传递信息、表达情感和记录生活的重要方式。然而,面对海量的图片资源,如何快速准确地找到相似的图片,成为了一个亟待解决的问题。现在,让我们为您揭开图片相似度的神秘面纱,带您领略这一创新技术的魅力! 图片相似度技术,就像是一位…...
JSON格式强制输出失败,深度解析DeepSeek-R1/V3模型token级响应机制与schema约束绕过方案
更多请点击: https://intelliparadigm.com 第一章:JSON格式强制输出失败的现象与根本归因 典型失败现象 当后端服务(如 Go/Node.js/Python)尝试通过 HTTP 响应强制输出 JSON 数据时,常出现空响应、500 错误、或返回 …...
Circuit Playground开发板入门:从零到一玩转集成传感器与Arduino编程
1. 项目概述与核心价值如果你对电子制作和编程感兴趣,但一看到复杂的电路图和密密麻麻的代码就头疼,那么Circuit Playground可能就是为你量身打造的“入场券”。它不是一个需要你从零焊接电阻、电容的散件包,而是一块将所有常用传感器和交互元…...
2026年国内GEO优化服务商盘点:6家主流选择的实际情况
说明: 本文盘点基于各服务商官网、公开媒体报道、可查询的工商信息整理,所有"案例数据"均来自服务商自我披露。GEO行业整体处于早期阶段,市场上自我标榜"行业第一""全球最强"的说法普遍存在,本文尽…...
提供充电桩运维托管的服务商:选择标准与服务内容解析
一、引言据中国电动汽车充电基础设施促进联盟(EVCIPA)数据显示,截截至2026年2月底,我国电动汽车充电基础设施(枪)总数达到2101.0万个,同比增长47.8%。其中,公共充电设施(…...
win2xcur:Windows光标主题完美移植Linux的格式转换指南
1. 项目概述:从Windows光标到Linux的“翻译官”如果你和我一样,是个在Linux桌面和Windows之间反复横跳的用户,或者你为团队维护着跨平台的开发环境,那你一定遇到过这个不大不小但很恼人的问题:Windows系统上那些精心设…...
AI编程也开始“贵价提速”?Cursor上线Opus极速模式,官方却劝你:别开,真不值!
前言各位码农老铁们,最近有没有感觉写代码像在开手动挡老爷车——油门踩到底,AI还在“思考人生”?别急,Cursor贴心地给你装了个“涡轮增压”:Claude Opus 4.7 Fast mode,号称速度拉满、输出飞起!…...
嵌入式Linux SBC硬件接口实战:I2C/SPI/UART配置与Adafruit Blinka集成指南
1. 项目概述与核心价值在嵌入式Linux单板计算机(SBC)的开发世界里,GPIO、I2C、SPI、UART这些接口就像是开发者的“瑞士军刀”。无论你是想读取一个温湿度传感器的数据,还是驱动一块显示屏,或者与另一个微控制器“对话”…...
Python篇---常考的数据类型
一、常见数据类型及其特点Python 的数据类型可以分两大类:不可变类型和可变类型。这个区分是很多考点的基础。1. 不可变类型(值变了,对象就换了)整数 int特点:精度无限,只有整数不分长短。适合大数运算。考…...
大模型低显存优化实战:量化、KV Cache与动态加载技术解析
1. 项目概述:低显存环境下的OpenClaw模型优化实战最近在GitHub上看到一个挺有意思的项目,标题是“openclaw-lowmem-optimization”。光看名字,就能猜到这大概是在做一件什么事:针对OpenClaw这个模型,进行低显存&#x…...
保姆级教程:用Docker部署Jenkins时,如何搞定Agent节点的50000端口映射(附避坑点)
深度解析Docker化Jenkins部署:50000端口映射全攻略与实战避坑指南 Jenkins作为持续集成领域的标杆工具,其容器化部署已成为现代DevOps实践的标配。但当Master节点运行在Docker环境中时,Agent节点连接失败的场景屡见不鲜——其中80%的问题根源…...
