1. 程式人生 > >QT中的qmake詳解

QT中的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。