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

Do I need do need to implicitly link between explicitly loaded shared libraries for interaction?

见下图。插件实现了核心库的接口。 (QtPlugin) 导出具体插件 class。插件应该能够从核心检索具体插件 class 实例并调用其方法。如果我想实现这种交互插件,我是否必须 link 插件相互对抗?

我不知道解析符号时到底发生了什么。据我所知,该过程存储已解析的符号。因此,一旦核心库解析了符号,插件就可以接收其他插件 classes 的 objects 并在其上调用方法,如果它们具有 headers。这是真的吗(对于所有平台)?

一些关于符号存储位置和谁可以访问它的一般信息也很好。

通常你 link 反对某些东西,所以插件 A links 反对核心库,因为它需要知道核心实现才能运行,隐含的 link 不存在,核心内部不知道插件 A(也不应该知道),因此核心不知道插件 A 或 B,这意味着插件 B 和 A 在没有 link 相互对抗的情况下也不会相互了解.

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

通常你 link 反对某些东西,所以插件 A links 反对核心库,因为它需要知道核心实现才能运行,隐含的 link 不存在,核心内部不知道插件 A(也不应该知道),因此核心不知道插件 A 或 B,这意味着插件 B 和 A 在没有 link 相互对抗的情况下也不会相互了解.

编辑评论:

在这种情况下,您可以使用插件继承的接口。所以在核心库中你做了一个叫做 ITerminal 的 class,它有一组没有实现的虚函数(更新,初始化,连接,打开,任何你需要的),然后 pluginA 可以从它继承和给出函数实现。这样其他插件就可以持有 ITerminal 的句柄并调用其上的函数而无需了解 pluginA 的详细信息。要创建它,你需要一个工厂,例如 Core::CreateTerminal,它将 return 一个 ITerminal (ITerminal* object = new PluginA();) 现在 pluginB 可以调用 Core::CreateTerminal,这给了他们一个句柄到 ITerminal,它具有 Core 在这种情况下选择的实现。要扩展它,您可以让插件将自己注册到核心,这样核心就可以调用插件中的创建函数,例如 pluginA 可以将自己注册为核心的 ITerminal class,然后当调用 CreateTerminal 时,它将调用插件创建一个特定的对象。这样你就可以交换插件(有不同的终端而不改变核心或其他插件)