我是否需要在隐式链接显式加载的共享库之间进行交互?

问题描述:

看到下面的图片。插件从核心库实现interace。 (QtPlugin)导出具体的插件类。插件应该能够从核心中检索具体的插件类实例并调用其方法。如果我想实现这种交互式插件,我必须将插件相互链接吗?我是否需要在隐式链接显式加载的共享库之间进行交互?

我不知道当符号解决时究竟发生了什么。据我所知,该过程存储已解析的符号。因此,只要核心库解析了符号,插件就可以接收其他插件类的对象,并调用其中的方法(如果它们具有标头)。这是真的吗(对于所有平台)?

关于符号存储位置以及谁可以访问符号的一些通用信息也很好。

enter image description here

+0

“我不知道什么时候符号得到解决完全发生” - 某些东西给你阅读右边那里.. –

+0

那些隐含链接没有任何意义 – VTT

+0

插件是在运行时动态加载的,还是由链接器在编译时静态加载的?你的问题并不清楚。 – 1201ProgramAlarm

通常你链接反对的东西,所以插件对核心库中的一个环节,因为它需要了解的核心实现的功能,隐式链接不存在,不存在内部核心插件A的知识(并且不应该有),所以核心不知道插件A或B,这意味着插件B和A不会彼此了解彼此。

在这种模式下你要保持它与插件之间不可知和使用接口或抽象类进行通信。 (例如,如果一个插件继承了Core的某些纯虚函数,另一个插件可以持有指向它的指针,并且在不知道完整实现的情况下调用函数)

通常你会链接某些东西,所以插件A链接核心库,因为它需要知道关于核心实现的功能,隐含的链接不存在,没有知识插件A内核(并且不应该)所以因此核心不知道插件A或B,并且意味着插件B和A不会彼此了解彼此。

编辑发表评论:

在可以使用的接口,它的插件继承这种情况下。所以在核心库中,您创建了一个名为ITerminal的类,该类具有一组虚拟函数(更新,初始化,连接,打开,无论您需要什么),而不需要实现,然后pluginA可以继承它并为函数实现。这样其他插件可以处理ITerminal并在不知道插件A的细节的情况下调用它的函数。要创建它,你需要一个工厂,例如Core :: CreateTerminal,它将返回一个ITerminal(ITerminal * object = new PluginA();)现在pluginB可以调用Core :: CreateTerminal,这给了他们一个ITerminal句柄,它有一个实现核心在这种情况下选择了。为了扩展它,你可以让插件自己注册到核心,所以核心只需在插件中调用一个创建函数,例如pluginA可以将自己注册为IT最终类到核心,然后当CreateTerminal被调用时,它会调用插件来创建一个特定的目的。这样你可以交换插件进出(有不同的终端,而无需更改核心或其他插件)

+0

我想让插件相互依赖。运行时会知道依赖关系。 libcore确保依赖项在依赖项之前加载并注入依赖项。用例困难的依赖:A负责所有终端的东西。 B需要开一个终端。用例可选的依赖关系:A提供了一个注册处理程序的接口,B想要注册一个。问题是如何用cpp实现它。 – ManuelSchneid3r

+0

因为它有点长我更新了答案,在您的评论中包含反馈 – Giel

+0

我很感谢您的帮助,但核心必须独立于接口。我只是测试它。通过链接到其他插件,硬体外观是“容易的”。然而,可选的依赖关系很难,因为我不能链接它们,因为链接器使它们成为一个很强的依赖关系。 – ManuelSchneid3r