多开发平台共用QT工程
QT支持多平台是其最显著的特点。本文将介绍如何建立多平台共用的QT工程,以方便在多平台之间切换编译。
本文假设我们在Windows和Ubuntu虚拟机两个环境中进行QT开发。开发目标可以是Windows, Ubuntu, Android和嵌入式的ARM Linux平台。
工程文件目录结构
首先假设我们在Windows下开发QT应用。那么建议的目录结构如下,(假设建立的工程为HelloWorld):
├─QTProjects
│ ├─HelloWorld
│ ├─ build-helloworld-Ubunut_Desktop_Qt_5_12_12_GCC_64bit-Debug //虚拟机Ubuntu kit的编译目录
│ ├─build-helloworld-Windows_QT5_14_2_on_Device1-Debug //windows kit的编译目录
│ ├─sources
│ │ └─HelloWorld.pro
│ ├─Project2
在工程目录HelloWorld下建立一个sources目录放置所有的源码,包括工程文件.pro。
在QTCreate的构建设置中,勾选Shadow build。这样为不同Kit的编译时,中间文件就会放置在工程总目录中的特定目录下,非常清晰而不会混合在一起。
如果不勾选Shadow build,每次在不同目标间编译切换时,都会对新的目标重新进行编译,效率低下。
.pro文件的结构
一个典型的多平台.pro示例如下,其包含了在Windows和虚拟机Ubuntu下对不同目标机的编译分支。
QT += core gui
RC_ICONS += logo.ico
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
QMAKE_LFLAGS += -no-pie
TARGET = HelloWorld
TEMPLATE = app
CONFIG(debug, debug|release): {
win32: { #辨别编译工作平台, windows
contains(QT_ARCH, arm64){ #检查目标平台
message("on Windows for ARM/AARCH64")
LIBS +=-L外部库相对目录 –l外部静态库
INCLUDEPATH += 外部库头文件目录
} else {
message("On Windows for Windows" $$PWD)
LIBS +=-L-L外部库相对目录 –l外部静态库
INCLUDEPATH +=外部库头文件目录
}
}
unix: {
android: {
message("for Android")
INCLUDEPATH += 外部库头文件目录
LIBS +=-L外部库相对目录 –l外部静态库
}
else: {
message("We are in Ubuntu $$QT_ARCH")
contains(QT_ARCH, arm64){
message("on Ubunt for aarch64")
INCLUDEPATH +=外部库头文件目录
LIBS +=-L外部库相对目录 –l外部静态库
}
contains(QT_ARCH, arm){
message("on Ubunt for armv7")
INCLUDEPATH +=外部库头文件目录
LIBS +=-L外部库相对目录 –l外部静态库
}
else {
message("On Ubuntu for Ubuntu")
INCLUDEPATH +=外部库头文件目录
LIBS +=-L外部库相对目录 –l外部静态库
}
}
}
}
#下面是为Release版本进行的配置,原理与Debug版相同,只是选择的外部库对应于Release版。
CONFIG(release, debug|release){
}
# The following define makes your compiler emit warnings if you use
# any feature of Qt whiLIBSch has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp \
HEADERS += \
mainwindow.h
RESOURCES += \
mainwindow.qrc
qnx: target.path = /tmp/$${TARGET}/bin
else:
unix:
!android:
target.path = /opt/$${TARGET}
# else:
# target.path =
!isEmpty(target.path): INSTALLS += target
编写.pro的重点
-
使用CONFIG对编译版本进行区分,即分为Release和Debug
-
使用contains语句判断编译平台和目标平台,形成不同的编译分支。
-
外部库是针对某个编译平台下的某个目标平台的,当需要使用外部库时,在相应的分支中指定这些库和它们需要的头文件目录。
-
编译时message提示的内容会显示在"概要信息"栏中。
在不同平台间共享工程
一般来说,我们是在Windows中进行软件开发。当需要时,采用虚拟机的方式建立Ubuntu并在其中进行软件的开发。
首先我们在Windows下按照上述的目录结构建立了一个QT的工程。在Ubuntu中共享QT的工程目录QTProjects。当我们在Ubuntu下使用QTCreate时,就可以通过共享目录打开已有的工程。
Ubuntu下打开QT工程的目录为
/mnt/hgfs/QTProjects