生成QT动态库DLL指导
生成QT动态库指导
1 背景
准备将常用接口封装成“类似QT提供的具有MOC特性的”DLL,这样可以方便地使用QT的信号和槽机制。
2 问题
用VS2015+QT或者QtCreater生成的QT的DLL其实都为C++标准DLL,无法使用QT的信号和槽。手动修改代码,添加上O_OBJECT之后,成功导出动态库。但是调用此动态库的时候,报错:无法导入静态数据成员。查看代码:
3 分析
QT自己的库,可以使用信号和槽,那肯定是我们的方法不对了。
3.1 错误方法,可以略过
查看代码,Meta-object可以动态生成,参见:
设置Q_MOC_RUN之后,确实再没有静态成员,但是编译错误太多了。改不胜改,应该是有其他关联设置,总之放弃这种方法。
3.2 正确方法
在QtCreater中,看到QT有Plugin库,用来生成可以加载到QtDesigner中的自定义库。
在VS中位置如下:
稍微改造其生成的代码,发现可以生成可以正常调用的动态库。
查看其代码,发现它定义了两个可疑预编译宏:
QT_DESIGNER_LIB
最终确认,需要第一个宏。具体的原理只能跟踪到:
qdesignerexportwidget.h
后面的代码看不到了,有兴趣的同学可以再研究下。
该宏字面上有Widget字样,如果导出类继承自QObject是否可以用呢?经过实验,是不行的。要导出QObject子类,没有找到对应的宏。时间关系,先挂起。
4 总结
4.1 生成DLL具体流程
下面说一下这种导出QT库方法的具体流程。
4.1.1 生成QT库
勾选Widget
4.1.2 添加预处理器 QDESIGNER_EXPORT_WIDGETS
4.1.3 添加接口类
注意: 基类和构造函数都必须设置为:QWidget
4.1.4 修改Inter.h文件
1、导出接口类
说明:如果动态库中某一个类里面有槽函数,则必须加入导出宏。
2、构造参数默认NULL:
4.1.5 编译.lib,.dll
为了方便调试,建议同时编译DEBUG版和RELEASE版。
4.2 调用DLL流程
添加Inter.h,TestQtDll.dll,TestQtDll.lib,采用间接调用。
构造类实例时,传入NULL,使用完成手动释放资源。