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

interface.h:

class PluginInterface
{

public:
        virtual void foo() = 0;
};

Q_DECLARE_INTERFACE(PluginInterface, MY_PLUGIN_VERSION)


我有and类实现了此接口:

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();

MySpecialPlugin的标题为“ MyPlugin.h”。 VS2008女士成功编译了该项目。但是我在链接步骤LNK2001(未定义的引用)上出错。但是,当将static void goo();更改为virtual void goo();时,它将起作用。

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

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

最佳答案

首先,您需要导出类(在Windows上,在编译“ myplugin”时在class关键字之后像__declspec(dllexport)一样神奇,在使用它编译代码时(在本例中为MySpecialPlugin),像__declspec(dllimport)一样神奇。您可以通过简单的define来实现。read more

#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的预处理器部分
您需要链接到导出库


调用静态和“普通”方法不同于调用虚拟方法...静态和“普通”方法始终位于特定地址,并且您的代码需要知道它在哪里...虚拟调用“检查”类vtable在您的方法的哪个地址具有实现并从该表“动态”获取该地址。另外,win32 VC平台需要定义“导出”(公开)的内容以从dll外部进行访问。因此,基本上,如果您想直接从MyPlugin调用任何东西(每个非虚拟成员都被直接调用),则必须将其导出到Win32 VC平台上。请注意,使用MyPlugin :: foo()直接调用虚拟方法将导致相同的错误

关于c++ - 创建Qt插件并使用非虚拟功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8614003/

10-12 21:29