創建項目文件
項目文件包含了qmake爲構建你的應用、庫或插件時所需要的全部信息。通常情況下,你需要
使用一系列的聲明來指定項目中的資源,但是對於簡單的編程結構的支持使您可以爲不同的平臺和環境描述不同的構建過程。
項目文件元素
qmake使用的項目文件格式能夠同時支持簡單的或十分複雜的構建系統。簡單的項目文件使用
簡單的聲明式風格,定義標準變了來指明項目中所使用的源文件和頭文件。複雜的項目可以使用
控制流程結構來調整構建過程。
下面幾節描述了不同類型的項目文件元素
變量
在項目文件中,變量被用來容納字符串列表。在最簡單的項目中,這些變量告知了qmake要使用
的配置選項和構建過程中需要的文件名與路徑。
qmake會在每個項目文件中尋找某些變量,然後使用他們的內容來決定什麼應該寫到makefile中。
比如,在“HEADERS”和“SOURCES”變量中的字符串列表告訴了qmake與項目文件在同一目錄下的
頭文件和源文件。
變量也可以在內部保存臨時值列表,現有值列表可以被新值覆蓋或擴展。
下列片段闡明瞭值列表是如何賦值給變量的。
HEADERS = mainwindow.h paintwidget.h
變量中的值列表以下列方式擴展:
SOURCES = main.cpp mainwindow.cpp \
paintwidget.cpp
CONFIG += console
注意:第一個賦值語句只包含指定在同一行裏的值是HEADERS變量。第二個賦值語句把
SOURCES裏不同行的值用反斜槓(\)分開。
“CONFIG”是另一個特殊的變量。在“通用配置”一節中將具體討論。在上面的代碼片段,
console被添加到CONFIG已經存在的值列表裏。
下面的表格列出了一些常用的變量和他們內容的描述。想查看全部變量請查看“變量”一章。
變量 | 內容 |
---|---|
CONFIG | 通用項目設置選項 |
DESTDIR | 生成的文件的放置路徑 |
FORMS | 用戶界面編譯器(uic)處理的UI文件列表。 |
HEADERS | 構建項目時需要的頭文件列表 |
QT | 項目中使用的QT模塊 |
RESOURCES | 資源文件列表 |
SOURCES | 源代碼列表 |
TEMPLATE | 該項目的模板,這決定了輸出文件是一個應用程序,還是一個庫或插件 |
可以通過在變量名前附加$$
讀取變量的內容。這樣可以把一個變量的內容賦值給另一個變量:
TEMP_SOURCES = $$SOURCES
$$
操作符被廣泛應用於對字符串和值列表進行操作的內建函數。查看qmake語言一章以獲取更多
空格
通常,空格分隔變量賦值中的值。要指定一個包含空格的值,你必須使用雙引號包住變量:
DEST = "Program Files"
引用的文本被視爲變量所保存的值列表中的單個項目。用來處理包含空格的路徑也是用相似的
方法。尤其是在Windows平臺下定義 INCLUDEPATH 和 LIBS 變量時:
win32:INCLUDEPATH += "C:/mylibs/extra headers"
unix:INCLUDEPATH += "/home/user/extra headers"
註釋
你可以在項目文件中添加註釋,註釋以#開頭,持續到行末。例如:
# Comments usually start at the beginning of a line, but they
# can also follow other content on the same line.
要在賦值變量時包含#字符,必需使用內置的LITERAL_HASH變量的內容
內建函數與控制流
qmake提供了許多內建函數來處理變量內容。在簡單項目文件中最常用的函數莫過於
“include()”函數,它需要一個文件名作爲參數,所提供的文件的內容將會被包含到
include函數被調用的位置。include函數通常被用來包含其他項目文件:
include(other.pro)
對於選擇結構的支持使得域能夠像編程語言中的if語句一樣工作:
win32 {
SOURCES += paintwidget_win.cpp
}
只有在條件爲真時花括號中的語句纔會起作用。在這種情況下,win32設置選項一定要被
設置。在Windows環境下它會自動設置,左邊的大括號必須和條件在同一行。
針對變量的更復雜的操作通常需要循環結構,這些操作一些內建函數實現,比如find(),
unique()和count().這些函數提供了對於字符串和路徑的操作,支持用戶輸入,
還可以調用外部工具。獲取更多有關如何使用函數的信息,請查看“qmake語言”
想要查看全部函數列表和他們的描述,可以查看“替換函數”和“測試函數”
項目模板
變量“TEMPLATE”被用來定義將要構建的項目的類型。如果它沒有在項目文件中定義,
qmake會假定構建一個應用程序,並且會生成一個合適的makefile(或等價文件)
下面的表格總結了可用的項目類型,並且描述了qmake將生成的文件。
模板 | qmake輸出 |
---|---|
app | makefile生成一個應用程序 |
lib | makefile生成一個庫 |
aux | makefile將什麼也不生成,在沒有編譯器需要被調用來創建目標的情況下使用它,比如你使用的是解釋型語言。注意:這個模板只能用於基於makefile的生成器。 |
subdirs | Makefile規則包含使用SUBDIRS變量指定的子文件。每一個子目錄必須包含它自己的項目文件。 |
vcapp | Visual Studio項目文件 生成一個應用程序 |
vclib | Visual Studio項目文件生成一個庫 |
vcsubdirs | Visual Studio解決方案文件要在子目錄生成項目 |
查看“構建通用項目類型”一節以獲得使用app和lib模板的項目文件的編寫建議
當使用subdirs模板時,qmake會生成一個makefile來檢查每一個指定的子目錄,
處理在子目錄中找到的所有項目文件,然後運行當前平臺的make工具處理新
生成的makefile,變量”SUBDIRS“被用來容納子目錄列表。
通用設置
變量“CONFIG”指定了項目應該配置的選項和功能。
項目可以以debug模式或release模式構建,兩種一起構建也可以,如果debug和release
同時被指定,最後一個會生效。如果你指定了debug_and_release
選項來同時構建
兩個版本,qmake生成的makefile會包含一個可以構建兩個版本的規則,可以用如下方式調用:
make all
向變量“CONFIG”中添加build_all選項可以將all規則設爲默認規則。
注意:在CONFIG變量中指定的每一個選項都可以被用做一個域的條件。你可以通過
使用內建的CONFIG()函數來檢測某些的配置選項是否存在,比如說,下面這幾行代碼
展示了該函數做爲域的條件時測試是否只有opengl選項被使用:
CONFIG(opengl) {
message(Building with OpenGL support.)
} else {
message(OpenGL support is not available.)
}
這允許針對release和debug定義不同的配置選項。查看“使用域”獲得更多信息
下列選項定義了將要構建的項目類型。
注意這些選項中的一些只會在相關平臺上起作用
選項 | 描述 |
---|---|
qt | 這是一個qt應用項目,並且依賴於qt庫。你可以使用變量“QT”來控制你的應用中所需要的QT模塊。這個值會默認添加,可以用CONFIG -= qt 來構建非QT應用 |
x11 | 這是一個X11應用或庫,如果目標使用了qt,這個值是不需要的。 |
應用程序和庫項目模板爲你提供了更專業的配置選項用來調整生成過程。
選項更詳細的解釋在Building Common Project Types
舉個例子,如果你的應用使用了qt庫並且你想以debug模式構建它,你的項目文件中
應當包含下面這行:
CONFIG += qt debug
注意:你必須使用“+=”,而不是“=”,否則qmake將無法使用qt的配置
來判斷你的項目所需要的設置。
Qt庫的聲明
如果變量“CONFIG”包含值qt,針對qt應用的qmake支持將會開啓。這樣就
可以微調你的應用程序使用的Qt模塊。這個功能需要與變量QT配合使用,
變量QT被用來聲明所需的額外的模塊。比如我們可以使用下面的方法來使用
XML和network模塊
QT += network xml
注意:變量QT默認包含core與gui模塊。下面的語句會忽略默認模塊,
導致編譯錯誤:
QT = network xml # This will omit the core and gui modules.
如果你想構建一個不含gui模塊的項目,你需要使用“-=”來排除它,應爲QT默認包含
core和gui,所以下面這行將會構建一個最小的qt項目:
QT -= gui # Only the core module is used.
配置特性
qmake可以設置額外的配置特性,這需要在特性文mingc件(.prf)中指定。這些額外的
特性通常會提供對定製工具的支持。想要在構建過程中添加一個特性,需要在
變量“CONFIG”後附加特性的名稱(特性文件名的詞幹)。
例如,qmake可以利用pkg-config支持的三方庫來構建應用,比如說D-Dus和ogg庫。
下面的代碼可以實現該功能:
CONFIG += link_pkgconfig
PKGCONFIG += ogg dbus-1
聲明第三方庫
如果你使用了第三方庫,你需要在你的項目文件中指定它。
qmake搜索庫的路徑和依賴的特定庫可以被添加到變量“LIBS”中,你可以指定庫的路徑
或使用Unix風格的記法來指定庫和路徑。
下面這行展示瞭如何指定一個庫:
LIBS += -L/usr/local/lib -lmath
包含頭文件的路徑也可以使用相同的方式添加到 INCLUDEPATH 變量
例如,添加幾個用於查找頭文件的路徑
INCLUDEPATH = c:/msdev/include d:/stl/include