插件系统如何工作?

jma*_*erx 5 c c++ plugins

我正在开发一个项目,我会发现一个基本的插件系统很有用.本质上,我创建了基类,并可以为插件开发人员提供此基类.然后开发人员覆盖它并覆盖方法.然后这就是我对它有点不清楚的地方.它是如何工作的?我在哪里可以找到有关这类系统开发的文档?

谢谢

sbi*_*sbi 7

我所知道的插件系统都使用动态库.基本上,您需要在系统内核和插件之间定义一个小而有效的握手.由于没有C++ ABI,插件必须只使用C API或使用与系统内核完全相同的编译器(可能还有编译器版本).

最简单的可想象的协议是一个函数,所有插件开发人员必须提供,它返回从基类派生的类的实例,作为基类指针返回.(extern "C"确保函数不会有一个错误的名称,因此更容易通过其名称找到.)类似于:

extern "C" {
  plugin_base* get_plugin();
}
Run Code Online (Sandbox Code Playgroud)

然后内核尝试将在指定位置找到的二进制文件作为动态库加载并尝试查找该get_plugin()函数.如果成功,则调用此函数并以加载的插件实例结束.

当然,最好还有一些函数可以检查插件编译的API版本与内核版本的对比.(毕竟,您可能会更改该基类.)并且您可能还有其他函数,它们返回有关插件的信息(或者您将其作为基类中的虚拟对象).这在很大程度上取决于系统的性质.