從零開始學(xué)Qt – 13:一文讀懂Qt項目管理文件
默認情況下,每個Qt項目都包含一個后綴名為.pro、名稱和項目名相同的文件,我們通常稱它為項目管理文件或者工程管理文件(簡稱項目文件)。
項目文件包含由qmake構(gòu)建應(yīng)用程序、庫或插件所需的所有信息。對于復(fù)雜的項目,一個項目中可能包含上百個源文件,Qt編譯這些源文件的方法是:先由qmake工具根據(jù)pro文件記錄的配置信息生成相應(yīng)的makefile文件,然后執(zhí)行make命令完成對整個項目的編譯。也就是說,pro文件存儲的配置信息是用來告知編譯器如何編譯當(dāng)前項目的,所以一個Qt項目要想完美運行,既要保證各個源文件中程序的正確性,還要保證項目文件中配置信息的合理性。
對于一個剛剛創(chuàng)建好的Qt項目,pro文件并不是空的,而是包含一些基本的配置信息。實際開發(fā)中,Qt會自動修改pro文件的內(nèi)容,但有時也需要我們手動修改,例如程序中用到某個第三方庫時,就需要我們手動修改pro文件。
本文為大家詳細地講解pro文件中各個配置信息的含義,以便于在需要時手動修改pro文件。
一、項目文件的要素
qmake所使用的項目文件格式可用于支持簡單和相當(dāng)復(fù)雜的構(gòu)建系統(tǒng)(build system)。簡單的項目文件使用一種直接的聲明樣式,通過定義標(biāo)準(zhǔn)變量來指定項目中使用的源文件和頭文件。復(fù)雜的項目可以使用控制流結(jié)構(gòu)(control flow structure)來微調(diào)構(gòu)建過程。
(1)變量
在項目文件中,變量用于保存由字符串組成的列表。在最簡單的項目中,這些變量告知qmake關(guān)于要使用的配置選項,或者提供要在構(gòu)建過程中使用的文件名和路徑。
qmake在每個項目文件中查找這些變量,并使用這些內(nèi)容來確定應(yīng)該寫入Makefile的內(nèi)容。例如,HEADERS和SOURCES中的值表示與項目管理文件在同一目錄中的頭文件和源文件。
變量還可以在文件內(nèi)部用于存儲臨時的值列表,并且現(xiàn)有的值列表可以用新的值進行覆蓋或擴展。
下面的語句說明了如何將值賦值給變量:
HEADERS = mainwindow.h paintwidget.hSOURCES = main.cpp mainwindow.cpp paintwidget.cpp
變量中的值通過以下方式進行擴展:
CONFIG = console
下表列出了一些常用的變量,并對其進行了簡要描述。本文后面會對一些變量進行專門介紹。
變量 | 說明 |
CONFIG | 一般項目配置選項 |
DESTDIR | 指定生成的應(yīng)用程序放置的目錄 |
TARGET | 指定目標(biāo)文件名。如果不設(shè)置,目標(biāo)名會被自動設(shè)置為跟項目文件一樣的名稱。 |
FORMS | 用戶界面編譯器(uic)要處理的UI文件列表 |
UI_DIR | 指定uic命令將.ui文件轉(zhuǎn)化成ui_*.h文件的存放的目錄 |
HEADERS | 構(gòu)建項目時使用的頭(.h)文件的文件名列表 |
QT | 在項目中使用的Qt模塊的列表 |
RESOURCES | 要包含在最終項目中的資源文件(.qrc)的列表 |
RCC_DIR | 指定rcc命令將.qrc文件轉(zhuǎn)換成qrc_*.h文件的存放目錄 |
SOURCES | 構(gòu)建項目時要使用的源代碼文件列表 |
TEMPLATE | 要用于該項目的模板。這個決定了構(gòu)建進程的輸出是應(yīng)用程序、庫還是插件。 |
INCLUDEPATH | 頭文件包含路徑 |
OBJECTS_DIR | 指定目標(biāo)文件(obj)的存放目錄 |
MOC_DIR | 指定moc命令將含Q_OBJECT的頭文件轉(zhuǎn)換成標(biāo)準(zhǔn).h文件的存放目錄 |
DEPENDPATH | 程序編譯時依賴的相關(guān)路徑 |
CODECFORSRC | 源文件編碼方式 |
LIBS | 引入的lib文件的路徑 |
一個變量的內(nèi)容可以通過用$$附加該變量名來讀取。這可以用來將一個變量的內(nèi)容賦值給另一個變量:
TEMP_SOURCES = $$SOURCES
$$操作符被廣泛地用于對字符串和值列表進行操作的內(nèi)置函數(shù)。
(2)空格
通常在賦值語句中,空格被用來分隔變量值。要指定包含空格的一個值,必須將這些值用雙引號括起來:
DEST = "Program Files"
類似的方法也用于處理包含空格的路徑,特別是在為Windows平臺定義INCLUDEPATH路徑和LIBS變量時:
win32:INCLUDEPATH = "C:/mylibs/extra headers"unix:INCLUDEPATH = "/home/user/extra headers"
(3)注釋
你可以向項目文件中添加注釋。注釋以#字符開始,并持續(xù)到同一行的末尾。例如:
# Comments usually start at the beginning of a line, but they# can also follow other content on the same line.
要在變量賦值中包含#字符,必須使用內(nèi)置的LITERAL_HASH變量的內(nèi)容。
(4)內(nèi)置函數(shù)和控制流程
qmake提供了許多內(nèi)置函數(shù)來處理變量的內(nèi)容。在簡單的項目文件中,最常用的函數(shù)是include()函數(shù),以一個文件名作為一個參數(shù)。給定文件的內(nèi)容將被包含在項目文件中使用include函數(shù)的位置。include函數(shù)最常用于包含其他項目文件:
include(other.pro)
對條件語句的支持是通過類似編程語言中的if語句的范圍(scopes)提供的:
win32 { SOURCES = paintwidget_win.cpp}
只有當(dāng)條件為真時,才會進行大括號內(nèi)的賦值操作。在上面的語句中,必須將CONFIG設(shè)置為win32,才會執(zhí)行SOURCES賦值,這在Windows上是自動進行的。第一個括號{必須與條件在同一行。
對于需要進行循環(huán)操作的變量,通常使用內(nèi)置函數(shù):find()、unique()和count()等等。這些函數(shù)可以用于操作字符串和路徑、支持用戶輸入和調(diào)用外部工具。有關(guān)使用這些函數(shù)的更多信息,請參見qmake語言。
二、項目模板(TEMPLATE變量)
TEMPLATE變量用于定義要構(gòu)建的項目的類型。如果沒有在項目文件中聲明,qmake假設(shè)應(yīng)該構(gòu)建一個application應(yīng)用程序,并將為此生成適當(dāng)?shù)腗akefile(或等效文件)。 下表總結(jié)了可用的項目類型,并描述了qmake將為每個項目生成的文件:
模板 | qmake輸出 |
app (缺省) | 構(gòu)建應(yīng)用程序的Makefile |
lib | 構(gòu)建庫(library)的Makefile |
aux | 不構(gòu)建任何東西的Makefile。如果不需要調(diào)用編譯器來創(chuàng)建目標(biāo),則可以使用此方法。 |
subdirs | 生成makefile文件編譯subdirs指定的子文件夾 |
vcapp | 建立一個應(yīng)用程序的VisualStudio項目文件 |
vclib | 建立一個庫的VisualStudio項目文件 |
vcsubdirs | VisualStudio解決方案文件,用于在子目錄中構(gòu)建項目 |
當(dāng)使用subdirs 模板時,qmake生成一個Makefile來檢查每個指定的子目錄,處理子目錄中包含的任何項目文件,并在新創(chuàng)建的Makefile上運行平臺的make工具。SUBDIRS 變量用于包含要處理的所有子目錄的列表。
三、CONFIG變量
指定項目配置和編譯器選項。這些值可以被qmake在內(nèi)部識別,部分選項的說明如下。
標(biāo)識名稱 | 說明 |
release | 應(yīng)用程序?qū)⒁詒elease模式生成。如果“debug”被指定,它將被忽略 |
debug | 應(yīng)用程序?qū)⒁詃ebug模式生成 |
warn_on | 編譯器會輸出盡可能多的警告信息。如果“warn_off”被指定,它將被忽略。 |
warn_off | 編譯器會輸出盡可能少的警告信息。 |
qt | 應(yīng)用程序是一個Qt應(yīng)用程序,并且Qt庫將會被鏈接。 |
thread | 應(yīng)用程序是一個多線程的應(yīng)用程序 |
windows | 只用于“app”模板:應(yīng)用程序是一個Windows下的窗口應(yīng)用程序 |
console | 只用于“app”模板:應(yīng)用程序是一個Windows下的控制臺應(yīng)用程序 |
dll | 只用于“l(fā)ib”模板:庫是一個共享庫(dll) |
staticlib | 只用于“l(fā)ib”模板:庫是一個靜態(tài)庫 |
plugin | 只用于“l(fā)ib”模板:庫是一個插件,這將會使dll選項生效 |
四、聲明Qt庫(QT變量)
通過QT變量,可以聲明所需的擴展模塊。例如,我們可以通過以下方式啟用XML和網(wǎng)絡(luò)模塊:
QT = network xml
注意:默認情況下,QT包括core和gui模塊,所以上面的聲明將network和XML模塊添加到這個默認列表中。以下賦值省略了默認模塊,這將在編譯程序時出現(xiàn)錯誤:
QT = network xml # 這將忽略core和gui模塊
如果您想構(gòu)建一個沒有g(shù)ui模塊的項目,那么需要使用“-=”操作符來排除它。默認情況下,QT同時包含core和gui,所以下面這一行將導(dǎo)致構(gòu)建一個最小的QT項目:
QT -= gui # 只包含了core模塊
五、聲明其他庫
如果除了使用Qt提供的庫之外,還在項目中使用其他庫,則需要在項目文件中指定它們。通過LIBS變量,可以指定qmake要搜索的庫和要鏈接的特定庫的路徑。例如,
LIBS = -L/usr/local/lib -lmath
包含頭文件的路徑也可以使用INCLUDEPATH 變量以類似的方式指定。 例如,要添加多個要搜索頭文件的路徑:
INCLUDEPATH = c:/msdev/include d:/stl/include
更具體的項目文件信息,可以參考Qt的幫助文件。
覺得有用的話,希望大家多多關(guān)注評論轉(zhuǎn)發(fā)[贊],謝謝!