首先,我使用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/