關於qmake,好一段時間令我一頭霧水,不知道用來幹嘛的,只知道怎麼用,而且也只懂那麼一兩個命令,詳細看過資料以後整理如下:
1.首先,感性的認識是,qmake可以利用源檔案(包括標頭檔h,實現檔案cpp,qt的ui檔案等等)產生各種不同類型的工程,工程需要的Makefile檔案,可執行檔與不可執行檔,這取決於所用的模板(包括app、lib、subdirs、vcapp、vclib)。
2.建立pro檔案,添加各種源檔案,還可以設定平台相關的不同源檔案,設定各種規則,利用qmake命令產生工程。後面會介紹pro檔案可以手工編寫,也可以利用qmake命令智能的產生。
一般順序是先建立.pro檔案,然後由.pro檔案產生Makefile檔案,makefile檔案儲存了編譯器和連接器的參數選項,還表述了所有源檔案之間的關係(原始碼檔案需要的特定的包含檔案,可執行檔要求包含的目標檔案模 塊及庫等).建立程式(make程式)首先讀取makefile檔案,然後再啟用編譯器,彙編器,資源編譯器和連接器以便產生最後的輸出,最後輸出並產生 的通常是可執行檔.建立程式利用內建的推斷規則來啟用編譯器,以便通過對特定cpp檔案的編譯來產生特定的obj檔案。
3.各種模板產生不同類型的工程,而每個模板可以用的qmake變數是不一樣的:
app模板:編譯一個可執行程式
選項 描述
windows 程式是Window平台的介面程式
console App模板專用: 程式是Window平台控制台程式
當你使用這個模板,以下的一些qmake變數是能用的,你可以在pro檔案使用這些變數來配置你的應用程式需要的相關的資訊
HEADERS –程式中需要編譯的標頭檔列表.
SOURCES -程式中需要編譯的源檔案清單.
FORMS – 由Qt Designer為程式建立的ui檔案清單(qte2是INTERFACES).
LEXSOURCES – 程式用到的所有的lex 源檔案清單.
YACCSOURCES -程式用到的所有的yacc 源檔案清單.
TARGET –可執行程式的名字.預設是跟工程檔案名稱一樣 (根據不同的平台尾碼名會自動添加).
DESTDIR –可執行檔的發布目錄.
DEFINES – 程式編譯時間候需要的預定義的列表INCLUDEPATH –程式需要的標頭檔的目錄列表.
DEPENDPATH –程式搜尋的依賴路徑.
VPATH – 尋找supplied 檔案的搜尋路徑(我還沒有弄懂~_~).
DEF_FILE – Windows 平台專用: 程式需要用到的.def .
RC_FILE – Windows 平台專用: 程式的資源檔.
RES_FILE – Windows 平台專用: 程式需要串連的資源檔.
lib模板庫:
lib模板告訴qmake產生的Makefile是將要編譯一個庫,使用這個模板的時候,另外的系統變數會加到上面app模板提到的變數,因為app模板是支援VERSION 變數,你應該在pro檔案使用這些來制定一些庫的庫的資訊
使用這個模板的時候,下面的選項可以添加到 CONFIG 變數裡面來決定編譯成何種庫
選項 描述
dll 編譯成動態庫 (dll or so).
staticlib 編譯成靜態庫.
plugin 編譯成外掛程式庫,本選項意味著dll也設定了.
VERSION – 目標庫的版本號碼,如 2.3.1
編譯成一個外掛程式
外掛程式的編譯是使用lib模板,正如上面所描述的那樣,這告訴 qmake產生的Makefile是將要編譯成為每個平台都適當的形式的外掛程式.通常是庫的形式,跟普通的庫一樣VERSION 變數是用來指定一些有關外掛程式的資訊
VERSION – 目標庫的版本號碼,如 2.3.1
聲明Qt庫模組
如果CONFIG變數包含了qt這個值,表明qmake支援了qt的程式,但是還需要調整一些你程式中使用的qt 的模組.這是使用QT變數,就能達到這個目的。QT是用來聲明使用到的一些額外的模組.例如.通過下面的方法,我們使得XML和網路模組有效
CONFIG += qt
QT += network xml
注意,預設情況下 QT 包含了 core 和 gui模組了所以上面的聲明是添加了XML和網路模組到預設的列表裡面.下面的語句就是忽略了預設模組,當編譯器原始碼時候會導致出錯
QT = network xml # This will omit the core and gui modules.
如果你想編譯一個不需要gui模組的工程,你需要用”-=”操作符號來去除包含,預設情況下,QT同時包含了core和gui兩個模組,所以下面的語句就是小型的Qt工程會被編譯
QT -= gui # Only the core module is used.
下面的表格顯示了QT變數可以使用的選項,並解釋了相應的特點
core (included by default) QtCore module 核心模組
gui (included by default) QtGui module 介面模組
network QtNetwork module 支援網路模組
opengl QtOpenGL module 支援opengl映像編程
sql QtSql module 支援sql資料庫驅動
svg QtSvg module 支援svg向量圖形
xml QtXml module 支援xml模組
qt3support Qt3Support module 支援qt3類
要注意的是,添加opengl到QT變數裡面 ,等價於往CONFIG變數裡面添加,所以對qt應用程式,沒有必要同時往QT變數和CONFIG變數裡面添加opengl選項
聲明Qt庫模組
qmake可以通過專門的prf檔案設定另外的配置特性.這些特性通常提供給編譯時間候的自訂的工具使用.為了在處理過程添加一個特性,往CONFIG變數裡面添加一個特性名字,該名字跟特性的檔案名稱相同(mkspecs\features目錄裡面)
例如 qmake可以在編譯過程利用pkg-config 提供支援的額外的庫,例如D-Bus庫 和 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
不過我的習慣是下面這樣的,比較清晰還有,最好windows的路徑不要有空格,中文也不要有,斜杠也推薦用/ 而不是windows的\ 因為跟分行符號\相同了 /可以在unix和windows用,但是\貌似到了unix或linux就不行了,所以用/ 是通用的
INCLUDEPATH = c:/msdev/include \
d:/stl/include
選項
在命令列裡面,為qmake指定一些選項是為了自訂編譯的過程。並覆蓋平台的為qmake做的預設設定,下面的基本的選項提供了用法資訊,指定qmake寫到輸出檔案的那裡,控制調試資訊的等級在控制台列印出來。
·help 列出qmake協助資訊
·o file 直接輸出到檔案file。如果這個選項沒有指定, qmake將會嘗試使用合適的檔案名稱作為輸出,這依賴於當前的運行模式。如果指定了‘-’, 輸出將會直接在控制台列印出來。
·d 列出qmake的調試資訊 由於工程需要在每個目標平台上進行不同的編譯,並有很多子目錄, 你可以在運行qmake的時候使用下面的選項來設定相應的指定平台的變數。
·unix qmake運行在unix模式。在這個模式下,將會使用unix風格的檔案命名規則和路徑轉換 , 另外的測試unix域是成功的。這是unix平台的預設模式。
·macx qmake運行在Mac OS X模式。在這個模式下,將會使用unix風格的檔案命名規則和路徑轉換 , 另外的測試macx域是成功的。這是Mac OS X平台的預設模式。
·win32 qmake運行在win32模式。在這個模式下,將會使用Windows風格的檔案命名規則和路徑轉換 , 另外的測試win32域是成功的。這是Windows平台的預設模式。 工程的模板通常在pro檔案的TEMPLATE 變數裡面指定。我們可以使用下面的選項來重寫或者覆蓋:
·t tmpl qmake將會用tmpl來重寫TEMPLATE變數的任何設定, 但只在pro檔案被處理之後。
·tp prefix qmake將添加prefix到TEMPLATE變數裡面。 調整警告資訊的層級能夠協助你找到pro檔案的問題所在:
·Wall qmake將會報告所有知道的警告資訊。
·Wnone qmake不產生任何警告資訊。
·Wparserqmake只產生詞法分析的警告。在解析你的pro檔案的時候會警告你一些普通的缺陷和潛在問題。
·Wlogic qmake警告你在pro檔案存在一些普通
Makefile 模式選項
qmake -makefile [options] files
在 Makefile 模式, qmake將會產生用於編譯工程的Makefile檔案,另外下面的選項可能在本模式下使用,以影響工程檔案的產生方式:
·after qmake將會在指定的檔案後面處理一些命令列給出的任務
·nocache qmake將忽略。qmake.cache 檔案。
·nodepend qmake將不產生任何依賴資訊。
·cache file qmake將使用指定的緩衝檔案file而忽略其他找到的.qmake.cache 檔案。
·spec spec qmake將會使用spec作為平台的路徑和編譯器資訊, 環境變數 QMAKESPEC 設定的值將會被忽略。
你也可以在命令列傳遞qmake參數;他們將會在所有的指定的檔案之前處理:
qmake -makefile -unix -o Makefile “CONFIG+=test” test.pro
上面的意思就是,在unix模式下,使用test.pro加入test選項產生Makefile,但是一些指定的選項當他們是預設的情況是沒有必要的添加的,因此,如果在unix上就是下面的
qmake “CONFIG+=test” test.pro
如果你確定你自己想在指定的檔案後面處理一些變數,你可以傳遞-after選項。當這個被指定時,命令列所有的任務在–after選項之後會被延遲,直到指定的檔案傳進來了。
Project 模式選項
Project Mode Options
qmake -project [options] files
在工程模式,qmake將會產生pro檔案。另外,你可以在本模式下添加下面的選項:
·r qmake將會遍曆目錄
·nopwd qmake將會不理會你當前工作目錄的原始碼檔案而去使用指定的檔案在這個模式.files變數可以是檔案或者目錄的列表 如果指定一個目錄,將會包含進DEPENDPATH變數裡面 目錄裡面相關的代碼會被包含進產生的工程檔案裡面。 如果給的是檔案, 將會添加到正確的變數, 這主要依賴於他們的副檔名(尾碼名); 例如, .ui 檔案會被添加到 FORMS(qt2是INTERFACES吧),
.cpp 檔案會被添加到 SOURCES。在這個模式下。你也可以傳遞任務到命令列裡面, 當這樣做的時候,這些任務將會放到產生pro檔案之後。
一般先用project模式產生.pro檔案,然後再將.pro檔案qmake一次產生Makefile。