Qt Plugin插件开发指南(2)- 工程框架设计
Date | Author | Version | Note |
---|---|---|---|
2021.03.14 | Dog Tao | V1.0 | 整理后发表。 |
2021.04.02 | Dog Tao | V1.1 | 在.pro 文件中复制文件的指令由system("copy XX YY") 改为QMAKE_POST_LINK += "copy XX YY" ,并增加了相关的说明。 |
插件生成与调用管理
指定插件生成目录
例如,在工程文件(.pro)文件增加如下内容,指定生成库文件到目标文件夹中:
# 指定生成目录
CONFIG(debug,debug|release)**{**
DESTDIR = $$PWD/../../Plugins/debug
}
else{
DESTDIR = $$PWD/../../Plugins/release
}
指定接口文件目录
例如,在工程文件(.pro
)文件增加如下内容,将接口文件复制到目标文件夹中:
InterfaceFile = $$PWD/imodbusrtumaster.h
#将LibFile中的"/"替换为"\"
InterfaceFile = $$replace(InterfaceFile, /, \\)
#输出目录也是一样,要将"/"替换为"\"
OutLibFile = $$PWD/../../Plugins/
OutLibFile = $$replace(OutLibFile, /, \\)
# QMAKE_POST_LINK表示编译后执行内容
# QMAKE_PRE_LINK 表示编译前执行内容
QMAKE_POST_LINK += "copy $$InterfaceFile $$OutLibFile"
# system("copy $$InterfaceFile $$OutLibFile")
需要特别注意的是.pro
文件中的使用QMAKE_PRE_LINK
与QMAKE_POST_LINK
执行多条系统命令时,从第二条命令开始要加上“&&”作为分隔,否则会导致命令执行失败。例如:
#### Copy the interface file of the plugin to the folder ####
InterfaceFile = $$PWD/icurvechart.h
# 将LibFile中的"/"替换为"\"
InterfaceFile = $$replace(InterfaceFile, /, \\)
#### Copy the library of the plugin to the folder ####
LibraryFile = $$DESTDIR/EWhalesCurveChart.dll
# 将LibFile中的"/"替换为"\"
LibraryFile = $$replace(LibraryFile, /, \\)
# 输出目录也是一样,要将"/"替换为"\"
OutLibFile = $$QT_PROJ_ROOTDIR/Plugins/
OutLibFile = $$replace(OutLibFile, /, \\)
# QMAKE_POST_LINK表示编译后执行内容
# QMAKE_PRE_LINK 表示编译前执行内容
# system("copy $$InterfaceFile $$OutLibFile")
QMAKE_POST_LINK += "copy $$InterfaceFile $$OutLibFile"
# system("copy $$LibraryFile $$OutLibFile")
QMAKE_POST_LINK += "&& copy $$LibraryFile $$OutLibFile"
插件开发与测试(Qt子工程)
一般情况下,我们开发插件时都需要一个配套的测试程序。此时利用Qt的子工程机制,将插件工程与测试工程作为子工程可以比较合适的完成此目标。一般步骤如下所示:
创建主工程
TEMPLATE = subdirs
SUBDIRS += $$PWD/EWhalesPlugin_CurveChart/source/EWhalesPlugin_CurveChart.pro \
$$PWD/CurveChartPluginTest/source/CurveChartPluginTest.pro \
CurveChartPluginTest.depends = EWhalesPlugin_CurveChart
CONFIG += ordered
TEMPLATE = subdirs
表明这是个工程集。
SUBDIRS = EWhalesPlugin_CurveChart CurveChartPluginTest
将插件开发工程与插件测试工程作为子工程包含进来。
CurveChartPluginTest.depends = EWhalesPlugin_CurveChart
将EWhalesPlugin_CurveChart
(生成插件)作为CurveChartPluginTest
(调用插件)的依赖项。
CONFIG += ordered
使用subdirs模板时,此选项指定应该按照目录列表的顺序处理它们(注意此项设置是一个有争议的内容)。 [Ref. 1] [Ref. 2]
设置插件开发项目
与第一章节介绍的类似,设置插件的输出路径,以方便测试工程调用。
CONFIG(debug,debug|release){
DESTDIR = $$PWD/../../bin/debug/plugins
}
else{
DESTDIR = $$PWD/../../bin/release/plugins
}
设置插件测试项目
设置可执行文件输出到插件生成目录中,并添加接口文件。
CONFIG(debug,debug|release){
DESTDIR = $$PWD/../../bin/debug
}
else{
DESTDIR = $$PWD/../../bin/release
}
INCLUDEPATH += ../../EWhalesPlugin_CurveChart/source
执行主工程
注意不要分别执行子工程的Release、Debug等操作,应当直接在主工程中执行编译、运行操作。