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