创建Qt插件和使用非虚拟函数

Creating Qt plugin and using non-virtual functions

本文关键字:虚拟 函数 Qt 插件 创建      更新时间:2023-10-16

首先我使用VS 2008和Qt 4.7.0动态构建。

interface.h:

class PluginInterface
{
public:        
        virtual void foo() = 0;
};
Q_DECLARE_INTERFACE(PluginInterface, MY_PLUGIN_VERSION)

我有一个实现这个接口的类:

myplugin.h

class MyPlugin: public QObject, public PluginInterface
{
public:
        Q_OBJECT
        Q_INTERFACES(PluginInterface)
        virtual void foo(); // this functions is implemented in cpp file.
        static QString goo(); // this function is also implemented in cpp file.
};

所以当我在其他项目(MySpecialPlugin)中使用这个插件时,它将被编译为动态链接库(实际上也是一个插件接口实现),我不能调用MyPlugin::goo();

MyPlugin.h"是MySpecialPlugin中可见的。并且Ms VS2008成功编译了该项目。但是我在链接步骤LNK2001上有错误,未定义的引用。但当static void goo();变为virtual void goo();时,它可以工作。

我正在使用Q_EXPORT_PLUGIN2宏创建插件。

我做错了什么?Qt是否对插件接口的实现设置了额外的要求?

  1. 首先,你需要导出你的类(在windows上,它的魔力像__declspec(dllexport)类关键字后编译你的"myplugin"和__declspec(dllimport)编译代码时使用它(在这种情况下MySpecialPlugin)。您可以通过简单的定义实现它。阅读更多

    #ifdef _WIN32
    #ifdef MYPLUGIN_COMPILE
    #define MYPLUGIN_EXPORT __declspec(dllexport)
    #else
    #define MYPLUGIN_EXPORT __declspec(dllimport)
    #endif
    #else
    #define MYPLUGIN_EXPORT
    #endif
    class MYPLUGIN_EXPORT MyPlugin
    {
         // implementation
    };
    

    并将MYPLUGIN_COMPILE添加到MyPlugin

  2. 的预处理器部分
  3. 你需要链接到导出库

调用静态和"普通"方法不同于调用虚拟方法…静态和"普通"方法总是在特定的地址,你的代码需要知道它在哪里……虚调用"检查"类虚函数表中的方法实现地址,并从该表"动态"地获取该地址。此外,win32 VC平台需要定义的东西是"导出"(暴露)从外部的dll访问。所以基本上,如果你想直接从MyPlugin调用任何东西(每个不是虚拟的成员都被直接调用),你必须在win32 VC平台上导出它。注意,使用MyPlugin::foo()直接调用virtual method会导致相同的错误