创建Qt插件和使用非虚拟函数
Creating Qt plugin and using non-virtual functions
首先我使用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是否对插件接口的实现设置了额外的要求?
-
首先,你需要导出你的类(在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
的预处理器部分 你需要链接到导出库
调用静态和"普通"方法不同于调用虚拟方法…静态和"普通"方法总是在特定的地址,你的代码需要知道它在哪里……虚调用"检查"类虚函数表中的方法实现地址,并从该表"动态"地获取该地址。此外,win32 VC平台需要定义的东西是"导出"(暴露)从外部的dll访问。所以基本上,如果你想直接从MyPlugin调用任何东西(每个不是虚拟的成员都被直接调用),你必须在win32 VC平台上导出它。注意,使用MyPlugin::foo()直接调用virtual method会导致相同的错误
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 用纯虚拟函数兜圈子
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 禁止子函数调用父级的抽象(或虚拟)函数
- 无法在子类中使用虚拟函数C++
- 无法在派生对象上运行虚拟函数
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 在 C++ 中将函数获取和设置为虚拟函数
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在C++中使虚拟函数私有化
- 模板继承类中的虚拟函数
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- doxygenc++虚拟函数和实现
- 如何从派生类函数中调用虚拟函数