使用qmake工具提升效率

2020-07-16 10:04:47
《第一個Qt程式》中使用的編譯命令還是比較簡單的,而《一個稍微複雜的Qt程式》中使用的編譯連結命令已經開始多起來了,還得先用 moc 工具生成元物件系統程式碼。這些還都是簡單程式碼,如果專案裡檔案增多,自己敲命令當然複雜了,因此 Qt 開發了自己的專案構建工具——qmake。

qmake 工具有兩種工作模式,它首先根據專案資料夾的標頭檔案、原始檔、圖形介面檔案、資原始檔等,生成標準的 .pro 專案檔案。然後使用第二種工作模式,qmake 可以根據 .pro 檔案自動生成 Makefile 檔案,我們就只需要執行一下 make 就行了,這就讓 Qt 程式的專案管理和構建生成變得輕鬆加愉快。

我們以《一個稍微複雜的Qt程式》中的例子示範 qmake 的簡單使用過程。在使用 qmake 之前,把之前生成的臨時檔案 moc_MyMainWindow.cpp、*.o 和 *.exe 都刪了,保留手動編寫的一個 .h 和兩個 .cpp 檔案就夠了。

1) 進入資料夾

開啟 Qt 命令列工具,進入程式碼所在資料夾:

cd /d D:QtDemo

2) 生成專案檔案

用 qmake 生成專案檔案:

qmake -project "QT+=widgets"

-project選項指明使用第一種工作模式,它會掃描當前資料夾裡的各種檔案,然後生成對應的 .pro 檔案。

"QT+=widgets"是我們針對 Qt5 自定義的一行文字,qmake 會把它新增到 .pro 檔案裡。qmake 預設會將 QtCore、QtGui 模組新增到專案檔案裡,但是從 Qt4 發展到 Qt5 後,將 QtWidgets 模組從 QtGui 裡面分離出來了,新的 QtWidgets 模組不會自動新增,所以我們手動在命令裡新增了 QtWidgets 模組,即在 .pro 檔案裡新增一句QT+=widgets

執行上面命令之後,在 D:QtDemo 資料夾裡會出現一個自動命名的 QtDemo.pro。該 .pro 檔案具體內容等會分析,我們先生成可執行程式看看。

3) 生成 Makefile 檔案

用 qmake 生成 Makefile:

qmake

qmake 不帶任何選項就是預設工作在第二種模式,它會掃描專案檔案 QtDemo.pro,自動生成 Makefile 檔案。

執行這條命令後,專案資料夾裡會多出來這些內容:debug 和 release 兩個資料夾,以及 Makefile、Makefile.Debug 和 Makefile.Release 三個檔案。

Makefile 是總的生成指令碼檔案,Makefile.Debug 用於生成可偵錯的目標程式,而 Makefile.Release 用於生成優化發行版的目標程式,總的指令碼 Makefile 會根據不同的 make 命令生成相應的偵錯版或優化發行版程式。

debug 資料夾是儲存編譯過程中的臨時檔案和可執行程式,這個是對於偵錯版程式。release 資料夾是也是類似的,但它是儲存優化發行版的可執行程式。

4) 生成可執行程式

呼叫 make 工具生成可執行程式:

mingw32-make

MinGW 的生成工具是 mingw32-make,該命令執行之後,預設生成的是 release 版可執行程式,在 release 資料夾裡。

如果想手動指定生成 debug 版本目標程式,可以執行命令:

mingw32-make debug

如果手動指定生成 release 版本目標程式,可以執行命令:

mingw32-make release

如果希望同時生成 debug 和 release 兩種版本程式,就執行:

mingw32-make all

執行這些命令後,可以在 debug 資料夾裡看到偵錯版的目標程式,在 release 資料夾裡看到優化發行版的目標程式,這兩個資料夾裡還有生成目標程式過程中的一些中間產物,如 moc_hellowidget.cpp、*.o 等。

我們在使用 qmake 構建程式的過程中,就不需要自己使用 moc 工具為 Qt 類生成元物件系統程式碼了,因為 qmake 自動將 moc 工具命令放在 Makefile 裡面,在構建程式時會自動處理,幫程式設計師省了許多事。以後章節裡還有 uic 、rcc 等工具也會自動在 Makefile 裡呼叫,這是 qmake 工具的方便之處。

5) 執行可執行程式

還在剛才的 Qt 命令列裡,如果要執行偵錯版目標程式:

debugQtDemo.exe

如果要執行優化發行版程式:

releaseQtDemo.exe

執行效果和之前小節的差不多,就不截圖了。對於 Linux 系統,檔案路徑的分隔符是 / ,並且在 Linux 裡的生成工具就是 make,比 mingw32-make 名字簡短。

分析 QtDemo.pro 檔案

接下來我們看看 QtDemo.pro 檔案裡的內容:

######################################################################
# Automatically generated by qmake (3.1) Tue Jun 4 15:59:41 2019
######################################################################

QT+=widgets
TEMPLATE = app
TARGET = QtDemo
INCLUDEPATH += .

# The following define makes your compiler warn you if you use any
# feature of Qt which 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

# Input
HEADERS += MyMainWindow.h
SOURCES += main.cpp MyMainWindow.cpp

檔案裡井號打頭的都是注釋,可以忽略掉。檔案裡實際起作用的就只有七句。

1) 第一句:

QT+=widgets

是我們在 qmake 命令裡面指定新增的 QtWidgets 模組(即 widgets),因為隱藏包含了 QtCore(即 core)和 QtGui(即 gui),所以不用手動新增 core 和 gui。

2) 第二句:

TEMPLATE = app

這代表生成的目標程式型別模板,app 是可執行的應用程式,另外還可以生成靜態庫和動態庫、外掛等等。一般大部分的模板都是 app 應用程式。

3) 第三句:

TARGET = QtDemo

TARGET 指定目標程式的名字,在 Windows 系統裡就是 QtDemo.exe,在 Linux 系統裡可執行程式不需要擴充套件名,直接就叫 QtDemo。

4) 第四句:

INCLUDEPATH += .

這句是將當前目錄.新增到了包含路徑(INCLUDEPATH)裡,程式編譯時除了從 Qt 庫的包含路徑,還會從當前目錄裡尋找標頭檔案,比如 MyMainWindow.h 就在當前資料夾裡。至於 Qt 庫的包含路徑,qmake 自己預設就會新增,不需要我們操心的。

5) 第五句:

DEFINES += QT_DEPRECATED_WARNINGS

當我們使用已被官方拋棄的 Qt 功能(語法、類、函數等)時,編譯器會給出警告。

6) 第六句:

HEADERS += MyMainWindow.h

HEADERS 就是指定專案裡的標頭檔案。

7) 第七句:

SOURCES += main.cpp MyMainWindow.cpp

SOURCES 就是指定專案裡的原始碼檔案。以後還會學到圖形介面檔案和資原始檔等,本節只需要標頭檔案和原始碼檔案。

可以看出 pro 檔案的語法是很簡潔明瞭的,認識點英文,猜都能猜到大致的意思是什麼。

注意檔案裡語句既有=,也有+=,這兩個的意義和 C++ 語法類似:=是賦值,左邊的變數會被指定為右邊的值,並且僅僅是右邊的值;+=是追加的意思,因為 qmake 會給一些變數預設新增 Qt 內建的一些值(如 Qt 庫的包含路徑),這些值是必需的,不能被取代,所以要用追加模式。

pro 檔案可以通過 qmake 生成,或者手動編寫 pro 檔案也行。qmake 又可以按照 pro 檔案的內容生成 Makefile,然後使用 make 構建目標程式。pro 檔案是非常關鍵的專案管理和控制專案生成的檔案,整合式開發環境 QtCreator 就是採用 pro 檔案管理和生成專案的,以後我們會大量接觸 pro 檔案。