如何使用实现纯接口的* part *的库为QT创建插件dll

时间:2015-12-26 08:59:12

标签: c++ windows qt

我一直在为一个有插件的项目重构一些代码。该插件基本上实现了(纯虚拟)接口。

但是,有些插件使用了大量的共享代码,目前这些代码是作为存档库构建的,并链接到每个插件dll中。在课堂形式中,它是这样的:

class PluginA : public Common { 
  QOBJECT
  Q_PLUGIN_METADATA(IID "org.me.PluginA" FILE "pluginA.json")
public:
    virtual void Func1() override { do stuff; }
    //virtual void Func2() override implemented in Common
    virtual void Func3() override { Common::Func3(); fiddle() }
};
//pluginB in a different DLL does similar things

然后这是一个静态库,它由pluginA和pluginB

链接
class Common : public SomeInterface {
    public:
    //virtual void Func1() override //implemented by plugin
    virtual void Func2 override { magic stuff, probably calling func2; }
    virtual void Func3() override { stuff; }
}

最后是只存在于头文件中的接口

class Someinterface {
    public:
    virtual void Func1() = 0;
    virtual void Func2() = 0;
    virtual void Func3() = 0;
}

现在,正如我所说,我想让Common成为一个插件模块。如果我这样做而不添加Q_PLUGIN_METADATA行,则不会添加任何内容作为入口点,并且链接会奇怪地失败

如果我添加Q_PLUGIN_METADATA行,QT中的某些内容会尝试实例化Common类的对象,但由于它没有实现所有函数(例如可能返回名称的Func1),因此不起作用。 ..)

我可以假设实现了一个虚函数,如果它被调用则引发异常,但是这会使得在某种程度上实现新的PluginC变得困难,因为你不会因为没有实现编译错误函数,你会得到运行时错误。

我可以采取哪些方法?请注意,还有其他插件直接从SomeInterface继承,不需要/使用pluginA和pluginB使用的公共代码。

0 个答案:

没有答案