0%

C++动态加载lib的插件机制实现

什么是插件

插件,想必大家应该是陌生了吧,什么Vim、VS code、JetBrains全家桶啊都支持插件,但是这背后是如何实现的呢?今天我们就来好好掰扯掰扯。首先我们可以先来看看对插件比较官方的定义,还麻烦大家挪挪步百度百科关于插件的定义,但是这些都不重要,重要的是我们要如何来实现插件机制,如何实现在对已有程序不做任何修改的情况下,对程序功能的扩展。。。

需求

大家先把菜刀准备好啊,需求要来了,贴个代码先:

1
2
3
4
5
int main(int argc, char *argv[])
{
printf("Hello world.\n");
return 0;
}

没错,这就是一个简单的Hello world,但是呢,

  • 产品汪A: 我这个项目要先打印一行123456再显示Hello world
  • 产品汪B: 我这个项目要先先打印Hello world再打印123456
  • 产品汪C: 我这个不显示Hello world,只打印123456
  • 产品汪…….

这个栗子比较简单,一般我们遇到的需求比这个复杂多了,动不动就是某某功能里面,我要加一个什么什么逻辑,所以针对不同的需求,就要编译N个版本的exe进行交付,然后又要挨着全部测试N遍吗?不,插件机制,就能很好的帮我们解决这个问题。

引入插件后的程序结构

image-20200308171242234

整个插件框架大概是这个样子的,最主要的编码工作是在PluginManager这个类里面,其他两个都是约定的接口,但是针对我们上面的需求,就是下面这个样子的:

image-20200308171922648

其中IPrintEvent是定义的一个打印事件,而PrintPlugin则是具体的打印实现过程,即直接将PrintPlugin的打印实现直接变成so,然后由程序启动后进行动态加载即可。

废话就不多说了,是骡子是马,咱拉出来溜溜,首先贴个图,便于直观的理解。