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

C++ 我是否需要在显式加载的共享库之间隐式链接以进行交互?,c++,dll,linker,shared-libraries,header-files,C++,Dll,Linker,Shared Libraries,Header Files,见下图。插件实现了来自核心库的交互。(QtPlugin)导出具体插件类。插件应该能够从核心检索具体的插件类实例并调用其方法。如果我想实现这种交互插件,我必须将插件相互链接吗 我不知道当符号得到解决时会发生什么。就我所能想象的,这个过程存储了解析的符号。因此,一旦核心库解析了这些符号,插件就可以接收其他插件类的对象并调用其上的方法(如果它们有头的话)。这是真的吗(适用于所有平台) 一些关于符号存储位置以及谁可以访问的通用信息也很好 通常你会链接到某个东西,因此插件A会链接到核心库,因为它需要知道核

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


我不知道当符号得到解决时会发生什么。就我所能想象的,这个过程存储了解析的符号。因此,一旦核心库解析了这些符号,插件就可以接收其他插件类的对象并调用其上的方法(如果它们有头的话)。这是真的吗(适用于所有平台)

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


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

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


一般来说,你链接到某个东西,所以插件A链接到核心库,因为它需要知道核心实现的功能,隐式链接不存在,核心内没有插件A的知识(不应该有),所以核心不知道插件A或B,这意味着插件B和插件A在没有相互链接的情况下也不会相互了解

编辑以供评论:
在这种情况下,您可以使用接口,插件从中继承。因此,在核心库中,您创建了一个名为ITerminal的类,它有一组虚拟函数(Update、Init、Connect、Open,您需要的任何函数),而无需实现,然后pluginA可以从中继承并提供函数实现。这样,其他插件就可以持有ITerminal的句柄并调用其上的函数,而不必知道pluginA的细节。要创建它,您需要一个工厂,例如Core::CreateTerminal,它将返回一个ITerminal(ITerminal*object=new PluginA();),现在pluginB可以调用Core::CreateTerminal,这将为它们提供一个ITerminal句柄,ITerminal具有Core在本例中选择的实现。为了扩展它,你可以让插件自己注册到core,这样core只需调用插件中的create函数,例如,pluginA可以将自己注册为core的一个ITerminal类,然后当调用CreateTerminal时,它将调用插件来创建一个特定的对象。通过这种方式,你可以交换插件(在不改变核心或其他插件的情况下使用不同的终端)

“我不知道符号解析后会发生什么情况”-你可以在这里阅读这些内容..这些隐式链接没有任何意义,因为你在运行时动态加载插件,还是在编译时由链接器静态执行?从你的问题中不清楚明确链接是什么。在运行时链接。VTT为什么这些imlipcit链接毫无意义?插件从核心库接收对象,需要知道类型。@JesperJuhl不幸的是,它非常复杂,我找不到任何好的资源。我想允许插件相互依赖。依赖项将在运行时已知。libcore确保在依赖项之前加载依赖项,并注入依赖项。用例硬依赖:A负责所有终端内容。B需要打开一个终端。用例可选依赖项:A提供注册处理程序的接口,B想要注册一个。问题是如何用cpp实现它。因为它有点长,我更新了答案,包括对您的评论的反馈。我感谢您的帮助,但核心必须独立于接口。我刚测试过。通过链接到其他插件,硬规范是“容易”的。但是,可选依赖项很困难,因为我无法链接它们,因为链接器使它们成为硬依赖项。Dll是可选的,.lib不是所有的依赖项都是共享库。然而,gcc抱怨在链接时缺少符号,这将在运行时可用