gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:10:31 25 4
gpt4 key购买 nike

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

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

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

enter image description here

最佳答案

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

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

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

编辑评论:

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

关于c++ - 我是否需要在显式加载的共享库之间隐式链接以进行交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45650404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com