多开发平台共用QT工程

多开发平台共用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的重点

  1. 使用CONFIG对编译版本进行区分,即分为Release和Debug

  2. 使用contains语句判断编译平台和目标平台,形成不同的编译分支。

  3. 外部库是针对某个编译平台下的某个目标平台的,当需要使用外部库时,在相应的分支中指定这些库和它们需要的头文件目录。

  4. 编译时message提示的内容会显示在"概要信息"栏中。

在不同平台间共享工程

一般来说,我们是在Windows中进行软件开发。当需要时,采用虚拟机的方式建立Ubuntu并在其中进行软件的开发。
首先我们在Windows下按照上述的目录结构建立了一个QT的工程。在Ubuntu中共享QT的工程目录QTProjects。当我们在Ubuntu下使用QTCreate时,就可以通过共享目录打开已有的工程。

Ubuntu下打开QT工程的目录为

/mnt/hgfs/QTProjects

你可能感兴趣的:(qt,开发语言)