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

发布于:2025-08-20 ⋅ 阅读:(14) ⋅ 点赞:(0)


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
        └─src
                CXXXLibApi.cpp
                CXXXLibApi.hpp
                CXXXService.cpp
                CXXXService.hpp
                XXXLib.cpp

PS 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(

网站公告

今日签到

点亮在社区的每一天
去签到