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

c++插件管理--pluma实践 - liyan

下面重新整理了一个例子,作为备注。

其中,device为一个虚基类,作为接口类存在。keyboardscreen作为实现了device的子类存在,实现具体的操作。在pluma上注册后,在main中调用接口,实现keyboardscreen的调用。

// device.hpp
#ifndef _DEVICE_HPP_
#define _DEVICE_HPP_
#include "Pluma/Pluma.hpp"class Device{
public:virtual std::string getDescription() const=0;
};
// create DevicedProvider class
PLUMA_PROVIDER_HEADER(Device);#endif
// device.cpp
#include "device.hpp"
PLUMA_PROVIDER_SOURCE(Device, 6, 3);

如上所示,是device的定义。其中PLUMA_PROVIDER_HEADERPLUMA_PROVIDER_SOURCEpluma提供的宏。功能暂且不论。我们继续往下看。

// screen.hpp
#include "Pluma/Pluma.hpp"
#include "device.hpp"class Screen: public Device{
public:std:: string getDescription() const{return "screen";}
};PLUMA_INHERIT_PROVIDER(Screen, Device);
// keyboard.hpp
#include "Pluma/Pluma.hpp"
#include "device.hpp"class Keyboard: public Device{
public:std:: string getDescription() const{return "keyboard";}
};PLUMA_INHERIT_PROVIDER(Keyboard, Device);

上面实现了screenkeyboard的逻辑。实现了之后,需要进行注册:

// connect.cpp#include <Pluma/Connector.hpp>#include "keyboard.hpp"#include "screen.hpp"PLUMA_CONNECTORbool connect(pluma::Host& host){// add a keyboard provider to hosthost.add( new KeyboardProvider() );host.add( new ScreenProvider() );return true;}

这里在connect中进行了两个子类的注册。之所以使用connect是因为后面的pluma使用的时候,官网给出的示例代码中,会从connect入口开始调用。

// main.cpp
#include "Pluma/Pluma.hpp"#include "device.hpp"
#include <iostream>
#include <vector>int main()
{pluma:: Pluma plugins;plugins.acceptProviderType<DeviceProvider>();plugins.load("./plugin/connect.so");//plugins.load("./plugin/keyboard.so");std::vector<DeviceProvider*> providers;plugins.getProviders(providers);std::cout<<"size for providers are:" << providers.size()<< std:: endl;if (!providers.empty()){for (std::vector<DeviceProvider*>::iterator device=providers.begin();device != providers.end(); ++ device){Device* myDevice = (*device)->create();std::cout << myDevice->getDescription() << std::endl;delete myDevice;}}return 0;
}

这里就是主要的调用逻辑了。官网中myDevice附近的拼写有主意,这是个坑了。
这里回顾下目录结构:

.
├── connect.cpp
├── device.hpp
├── device.cpp
├── keyboard.hpp
├── main.cpp
├── plugin                          # 用来存储插件结果的目录
├── Pluma                           # 为了方便,这里将Pluma的include及src文件均拷贝到这里
│   ├── Config.hpp
│   ├── Connector.hpp
│   ├── Dir.cpp
│   ├── Dir.hpp
│   ├── DLibrary.cpp
│   ├── DLibrary.hpp
│   ├── Host.cpp
│   ├── Host.hpp
│   ├── PluginManager.cpp
│   ├── PluginManager.hpp
│   ├── Pluma.hpp
│   ├── Pluma.inl
│   ├── Provider.cpp
│   ├── Provider.hpp
│   └── uce-dirent.h
└── screen.hpp

看下编译过程:

# 生成device.so
g++ connect.cpp device.cpp Pluma/*.cpp -shared -fPIC -o plugin/connect.so -I./# 生成main
g++ main.cpp device.hpp device.cpp Pluma/*.cpp -o main -I./ -ldl

执行:

./main
size for providers are:2
keyboard
screen

以上就是实践的内容了。

http://www.jsqmd.com/news/481759/

相关文章:

  • 四周速成!从零掌握AI大模型,内含实战项目与学习计划_30天大模型开发速成
  • 09 部署与成本控制:Serverless 架构下 Agent 的 Token 优化艺术
  • 老王-城府不是心机而是清醒的边界感
  • BPF 获取 LVS FullNat 模式下的 Client IP - liyan
  • 解决RDK X5(ARM64架构)板卡Remote-SSH运行Antigravity AI崩溃(SIGILL):Samba网络盘本地挂载方案
  • 强烈安利! AI论文工具,千笔AI VS 灵感风暴AI,专科生必备神器!
  • centos 安装docker并构建golang镜像 - liyan
  • 狡猾的北狐狸
  • 老王-三观稳则人生稳
  • centos 构建 local-k8s - liyan
  • 老王-老祖宗没说完的后半句
  • 2026涂塑钢管市场评测:哪些公司口碑较好?IPN8710防腐钢管/圆孔滤水钢管 ,涂塑钢管制造厂家推荐排行榜单 - 品牌推荐师
  • 老王-缺心眼是边界感缺失
  • clisp编译 - liyan
  • 老王-家兴不在运在德
  • challenges of bpf tracing go - liyan
  • 泛型体系实战
  • 电机设计仿真:Maxwell ANSYS 五相电机设计
  • Openclaw 附录B 常用Skills清单
  • 053店铺租赁租凭平台系统-springboot+vue
  • Openclaw 附录C 配置模板与自定义参考
  • babyRE
  • 云上OpenClaw实操视频教程合集
  • LeetCode:70. 爬楼梯
  • 青岛东泉环保智能设备有限公司电话查询:供应商联络方式与注意事项 - 品牌推荐
  • 零人类公司编排框架Paperclip的安装
  • CWT-CNN-GRU基于连续小波变换和卷积神经网络-门控循环单元故障诊断MATLAB代码
  • CSDN博客汇总(101-200篇)
  • OpenClaw 核心技术框架深度
  • COMSOL模拟含裂缝地层流动与传热耦合及油藏数值模拟:注入井与生产井的交叉裂缝流动考虑