qt插件开发一般步骤

写在前面:

1. 同一个dll在同一个进程中,多次load,返回句柄是否一样,全局变量和静态变量是否共享?

:是一样的,变量共享并保存
2. 在1之上,free后,再次load,句柄是否一样,全局和静态变量是否被保存?

:不一定,变量不共享,当free后,dll资源都释放了,也就不存在了。
1和2即使不在同一个线程,只要同一个进程也成立。
总结:同一个进程,多次load同一个dll,句柄和函数指针都不会变,全局变量和静态变量也会共享,只有dll完全free后才会释放所有资源,
      此时再次load后,又重新分配资源,之前的全局变量和静态变量的值不会被保存的。
3. Linux的so呢
4. Qt的plugin也同上,QPluginLoader-->QLibrary-->QLibraryPrivate-->QLibraryStore。

【qt插件开发一般步骤】

1. 新建一个接口插件,里面只有接口没有实现,就是一个抽象类
新建工程--->Library--->C++Library--->下一步下一步输入项目名称,type选择Qt Plugin
然后在pro中  DEFINES += API_INTERFACEPLUGIN_EXPORT
2. 新建接口导出类
#ifdef INTERFACEPLUGIN_CLASS_LIBRARY
#define API_INTERFACEPLUGIN_EXPORT Q_DECL_EXPORT  //声明接口导出
#else
#define API_INTERFACEPLUGIN_EXPORT Q_DECL_IMPORT  //声明接口导入
#endif

#include <QObject>
#include <QtGlobal>

#define InterfacePlugin_IID "com.plugintest.interfaceplugin.iid"
【需要导出】
class API_INTERFACEPLUGIN_EXPORT InterfacePlugin : public QObject
{
    Q_OBJECT

public:
    explicit InterfacePlugin(QObject *parent = nullptr);
    virtual ~InterfacePlugin();
	virtual void test()=0;
private:
};

QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(InterfacePlugin, InterfacePlugin_IID)
QT_END_NAMESPACE
3.新建实现接口插件的类,同上
然后在pro中包含InterfacePlugin头文件库目录
INCLUDEPATH += \
    $$PWD/../InterfacePlugin
同时引入库(这步骤相当于是隐式加载dll)
LIBS += -L$$PWD/../$${MY_OUTPUT_DIR}/ -lInterfacePlugin	
#include "InterfacePlugin.h"
【不需要导出】
class BirdPlugin : public InterfacePlugin
{
    Q_OBJECT
    Q_INTERFACES(InterfacePlugin)
    Q_PLUGIN_METADATA(IID InterfacePlugin_IID)

public:
    explicit BirdPlugin(QObject *parent = nullptr);
    virtual ~BirdPlugin();
	virtual void test(){。。。。。。}
private:
};
4.在exe主应用中,只需要
INCLUDEPATH += \
    $$PWD/../InterfacePlugin
LIBS += -L$$PWD/../$${MY_OUTPUT_DIR}/ -lInterfacePlugin	
包含接口头文件和引入接口插件即可,
因为其他插件是间接被加载的
QPluginLoader

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值