所以我有一个基于 QT API 的应用程序,它使用 QPlugin 系统。使用起来相当简单,您定义一个从接口继承的类,当插件加载时,您会得到该类的一个实例。最后,它会归结为dlopen
/dlsym
或LoadLibrary
/ GetProcAddress
,任何适合操作系统的东西。我在这里没有问题,一切都按预期工作。
所以,正题。有很多功能涉及需要引用主应用程序提供的数据/功能的插件。例如,我的应用程序有一个 GUI,所以我的应用程序中有一个“ plugin::v1::gui
”函数,它返回一个QWidget *
. 如果我希望插件能够向我的 UI 添加内容,或者甚至让它的对话框成为我的 UI 的子级,它需要一个指向它的指针。
我开始在 Linux 上进行开发并很快遇到这样一个事实,即默认情况下,加载器不会用加载它的应用程序中的符号填充共享对象中的未解析符号。没问题,轻松解决。将“ -rdynamic
”添加到我的标志并继续前进。事情运作良好。
现在我发现在 Windows 上似乎没有等价物:(。那么什么是好的解决方案?
到目前为止,我想出的最好的方法是在我的主应用程序中填充一个结构,该结构具有指向插件可能关心的每个对象/函数的指针。然后将其传递给插件的 " init()
" 函数,现在它具有指向所有内容的正确指针,但这是一个烦人的解决方案,因为现在每当我添加某些内容时,我都必须在多个地方进行更改。
有更好的解决方案吗?SO 社区是如何处理这个问题的?