当前位置: 首页 > news >正文

【CPP】一个CPP的Library(libXXXcore)和测试程序XXX_main的Demo

一个CPP的Library和测试程序Demo

  • 1. 思路描述
    • 目录结构
    • 总控CMakeList.txt文件
  • 2. Library代码实现
    • 2.1 XXXLib.hpp文件(对外的接口定义文件)和XXXLib.cpp文件
      • 2.1.1 XXXLib.hpp文件
      • 2.1.2 XXXLib.cpp文件
    • 2.2 CXXXLibApi.hpp文件和CXXXLibApi.cpp文件(内部的API基类)
      • 2.2.1 CXXXLibApi.hpp文件
      • 2.2.2 CXXXLibApi.cpp文件
    • 2.3 CXXXService.hpp和CXXXService.cpp文件(具体的业务类)
      • 2.3.1 CXXXService.hpp文件
      • 2.3.2 CXXXService.cpp文件
    • 2.4 CMakeLists.txt
  • 3. XXX_main测试程序代码实现
    • 3.1 main.cpp文件
    • 3.2 XXX_main的CMakeLists.txt文件
  • 4. 编译过程
  • 5. 执行过程
  • 6. UML图分析
    • 6.1 类图
    • 6.2 序列图
  • 7. 遗留问题


1. 思路描述

实现一个简单的library 和 测试主程序Demo。

  • Library内容包括:
  1. class分层的Library源码。
  2. 定义API类,提供给外部调用程序操作library的入口。
  3. 定义Callback类,提供给外部程序library有哪些返回信息。
  4. 一个LibManager,用于关联API类和Callback类。
  5. 一个CMakeLists.txt,用于编译生成libXXXCore库。
  • XXX_main测试程序:
  1. 一个Main程序,展示如何使用Library库。
  2. 一个CMakeLists.txt, 用于编译生成可执行文件XXX_main。

由于笔者在Windows 11系统, JetBrains CLion开发该Demo,因此,生成的library和可执行文件是libXXXCore.dll和XXX_main.exe文件。

此处主要是想分享一种Class分层设计的思想,供交流学习。

同样,可以将源代码移植到Linux平台上,编译成libXXXCore.so库和XXX_main可执行文件。


目录结构

C:.
│  CMakeLists.txt
└─soDemo├─main│      CMakeLists.txt│      main.cpp│└─XXXCore│  CMakeLists.txt│├─include│      XXXLib.hpp└─srcCXXXLibApi.cppCXXXLibApi.hppCXXXService.cppCXXXService.hppXXXLib.cppPS C:\Users\84029\CLionProjects\hello0614>

总控CMakeList.txt文件

cmake_minimum_required(VERSION 3.15)
project(hello)
set(CMAKE_CXX_STANDARD 11)
add_subdirectory(soDemo/XXXCore)
add_subdirectory(soDemo/main)

2. Library代码实现

2.1 XXXLib.hpp文件(对外的接口定义文件)和XXXLib.cpp文件

2.1.1 XXXLib.hpp文件

#ifndef __XXXLIB_HPP__
#define __XXXLIB_HPP__#include <stdint.h>
#include <stdlib.h>
#include <vector>
#include <thread>
#include <mutex>class IXXXLibApi;
class IXXXLibCallback;#define S_LIB_OK               (0)
#define E_LIB_FAILED           (-1)
#define E_LIB_TIMEOUT          (1)class XXXLibManager
{
public:static IXXXLibApi* getXXXLibApi(IXXXLibCallback* XXXLibCb);
};class IXXXLibApi
{
public:virtual int32_t init() = 0;virtual int32_t play(uint8_t id) = 0;virtual int32_t stop(void) = 0;virtual int32_t scan(void) = 0;
private:
};class IXXXLibCallback
{
public:virtual void notifySignalStrength(int8_t signalStrength) = 0;
};#endif

注意事项:

  1. XXXLib.hpp文件是定义的对外的接口文件,定义了API虚基类和Callback虚基类。调用者的程序需要include该头文件。

2.1.2 XXXLib.cpp文件

#include "../include/XXXLib.hpp"
#include "CXXXLibApi.hpp"IXXXLibApi* XXXLibManager::getXXXLibApi(IXXXLibCallback* XXXLibCb)
{printf("XXXLibManager::getXXXLibApi()\n");return CXXXLibApi::getInstance(XXXLibCb);
}

2.2 CXXXLibApi.hpp文件和CXXXLibApi.cpp文件(内部的API基类)

2.2.1 CXXXLibApi.hpp文件

#ifndef CXXXLIBAPI_HPP
#define CXXXLIBAPI_HPP#include <stdint.h>
#include <stdlib.h>
#include <thread>
#include "../include/XXXLib.hpp"
#include "CXXXService.hpp"
using namespace std;class CXXXLibApi : public IXXXLibApi
{
public:static IXXXLibApi* getInstance(IXXXLibCallback* cb);virtual int32_t init();virtual int32_t play(uint8_t id);virtual int32_t stop(void);virtual int32_t scan(void);private:CXXXLibApi(IXXXLibCallback* cb);virtual ~CXXXLibApi();private:static IXXXLibApi* mpApi;IXXXLibCallback* mpCb;CXXXService *mpXXXService;
};#endif

2.2.2 CXXXLibApi.cpp文件

#include "../include/XXXLib.hpp"
#include "CXXXLibApi.hpp"IXXXLibApi *CXXXLibApi::mpApi = NULL;CXXXLibApi::CXXXLibApi(IXXXLibCallback *cb) : mpCb(cb)
{mpXXXService = CXXXService::getInstance();
}CXXXLibApi::~CXXXLibApi()
{
}IXXXLibApi *CXXXLibApi::getInstance(IXXXLibCallback *cb)
{if (NULL == mpApi){printf(
http://www.dtcms.com/a/339433.html

相关文章:

  • 【服务器】Apache Superset功能、部署与体验
  • Leetcode 深度优先搜索 (7)
  • 支持冲刺规划的敏捷开发任务分配工具推荐(附对比)
  • Flask 路由详解:构建灵活的 URL 映射系统
  • ISIS高级特性
  • 前端下载文件、压缩包
  • 【深度解析----Pycharm命令行和项目中Settings-Interpreter中安装的插件库不一致的原因以及解决办法】
  • 权重、偏置、运行均值、运行方差的概念
  • 【基础-判断】所有使用@Component修饰的自定义组件都支持onPageShow,onBackPress和onPageHide生命周期函数
  • 图形化监控用数据动态刷新方法
  • 快手Klear-Reasoner登顶8B模型榜首,GPPO算法双效强化稳定性与探索能力!
  • Linux 定时任务 + Oracle 19c 备份完整操作手册(Linux→windows server)
  • 【git】改 GitLab 远程分支名;
  • Unity高级开发:反射原理深入解析与实践指南 C#
  • Java 线程状态与线程组
  • 水闸安全综合监测系统解决方案
  • Kafka 面试题及详细答案100道(1-10)-- 基础概念与架构
  • NestJS @Inject 装饰器入门教程
  • Hugging Face 核心组件介绍
  • 大功率变速箱总成双联试验台架系统参数
  • 机器人控制基础:运动控制中的串级pid原理以及实现方案(包含代码示例)
  • C/C++ 常见笔试题与陷阱详解
  • .net core web程序如何设置redis预热?
  • 【大白话解析】 OpenZeppelin 的 Address 库:Solidity安全地址交互工具箱​(附源代码)
  • Mybatis执行SQL流程(四)之MyBatis中JDK动态代理
  • Ansible 异步任务管理与内容重用详解
  • 10.Ansible角色管理
  • Ubuntu 和麒麟系统创建新用户 webapp、配置密码、赋予 sudo 权限并禁用 root 的 SSH 登录的详细
  • 网络间的通用语言TCP/IP-网络中的通用规则3
  • 缓存雪崩、缓存穿透、缓存击穿在实际中如何处理