QT .pro檔案解讀
模板變數作用告訴qmake為這個應用程式具體生成哪種makefile。下面是模板變數可供選擇的值:
- app 模板變數的預設值。建立一個應用程式的makefile。
- lib 建立一個庫的makefile。
- vcapp 建立一個應用程式的Visual Studio專案檔案。
- vclib 建立一個庫的VisualStudio專案檔案。
- subdirs 這是一個特殊的模板,它可以建立一個能夠進入特定目錄且為一個專案檔案生成makefile,還能為它再呼叫make的makefile。
由以上分析可知,模板變數值不同,生成的makefile檔案也會隨之改變。那麼,預設的同時是最常用的app值,模板請參見下文。
2.2 app模板
app模板告訴qmake為建立一個應用程式生成一個makefile。
當使用這個模板時,設定下面這些qmake系統變數值是有效的。可以在你的.pro檔案中使用它們為你的應用程式指定特定資訊。
- HEADERS - 應用程式中的所有標頭檔案的列表。
- SOURCES - 應用程式中的所有原始檔的列表。
- FORMS - 應用程式中的所有.ui檔案(由Qt設計器生成)的列表。
- LEXSOURCES - 應用程式中的所有lex原始檔的列表。
- YACCSOURCES - 應用程式中的所有yacc原始檔的列表。
- TARGET - 可執行應用程式的名稱。預設值為專案檔案的名稱。(如果需要副檔名,會被自動加上。)
- DESTDIR - 放置可執行程式目標的目錄。
- DEFINES - 應用程式所需的額外的預處理程式定義的列表。
- INCLUDEPATH - 應用程式所需的額外的包含路徑的列表。
- DEPENDPATH - 應用程式所依賴的搜尋路徑。
- VPATH - 尋找補充檔案的搜尋路徑。
- DEF_FILE - 只有Windows需要:應用程式所要連線的.def檔案。
- RC_FILE - 只有Windows需要:應用程式的資原始檔。
- RES_FILE - 只有Windows需要:應用程式所要連線的資原始檔。
你只需要使用那些你已經有值的系統變數。例如,如果你不需要任何額外的INCLUDEPATH,那麼你就不需要指定它,qmake會為所需的系統變數提供預設值。
注意:如果條目是單值的,比如template或者目的目錄DESTDIR(可執行檔案或二進位制檔案的釋出目錄),我們是用“=”,但如果是多值條目,我們使用“+=”來為這個變數新增現有的條目值。
使用“=”會用新值替換原有的值。例如,如果我們寫了DEFINES = QT_DLL,其它DEFINES所有的條目值都將被刪除並用QT_DLL替代
2.3 lib模板
lib模板告訴qmake為建立一個庫而生成一個makefile。當使用這個模板時,除了app模板中提到的系統變數外,還有一個VERSION是被支援的。
你需要在為庫指定特定資訊的.pro檔案中使用它們。VERSION - 目標庫的版本號。比如,2.3.1。
2.4 subdirs模板
subdirs模板告訴qmake生成一個makefile,它可以進入到特定子目錄併為這個目錄中的專案檔案生成makefile並且為它呼叫make。
在這個模板中只有一個系統變數SUBDIRS可以被識別。這個變數中包含了所要處理的含有專案檔案的子目錄的列表。這個專案檔案的名稱是和子目錄同名的,這樣qmake就可以發現它。
例如,如果子目裡是“myapp”,那麼在這個目錄中的專案檔案應該被叫做myapp.pro。
3.配置變數CONFIG
配置變數CONFIG 指定了編譯器所要使用的選項和所需要被連線的庫。配置變數中可以新增任何東西,但只有下面這些選項可以被qmake識別。
3.1 控制編譯器
下面這些選項控制著使用哪些編譯器標誌:
- release - 應用程式將以release模式連編。如果“debug”被指定,它將被忽略。
- debug - 應用程式將以debug模式連編(與release互斥)。
- debug_and_release - 工程同時用除錯和釋出模式編譯。
- build_all - 如果指定是debug_and_release模式,工程預設是同時用除錯和釋出模式編譯。
- ordered - 使用subdirs模板時,本選項指定了子目錄應該按照給出的順序編譯。
- warn_on - 編譯器會輸出儘可能多的警告資訊。如果“warn_off”被指定,它將被忽略。
- warn_off - 編譯器會輸出儘可能少的警告資訊(與warn_on互斥)。
3.2 連編型別
下面這些選項定義了所要連編的庫/應用程式的型別:
- qt - 應用程式是一個Qt應用程式,並且Qt庫將會被連結。
- thread - 應用程式是一個多執行緒應用程式。
- x11 - 應用程式是一個X11應用程式或庫。
- windows - 只用於“app”模板:應用程式是一個Windows下的視窗應用程式。
- console - 只用於“app”模板:應用程式是一個Windows下的控制檯應用程式。
- dll - 只用於“lib”模板:庫是一個共享庫(dll)。
- staticlib - 只用於“lib”模板:庫是一個靜態庫。
- plugin - 只用於“lib”模板:庫是一個外掛,這將會使dll選項生效。
例如,如果你的應用程式使用Qt庫,並且你想把它連編為一個可除錯的多執行緒的應用程式,你的專案檔案應該會有下面這行:
注意,你必須使用“+=”,不要使用“=”,否則qmake就不能正確使用連編Qt的設定了,比如沒法獲得所編譯的Qt庫的型別了。
3.3 宣告QT庫模組
如果CONFIG變數值中包含了qt這個值,qmake支援了qt的程式(因為qmake也可以用在非qt程式的編譯)這就要調整一些你程式中使用的qt的模組,而QT變數,正是達到這個目的的。QT是用來宣告使用到的一些額外的模組,例如:通過下面的方法使得xml和網路模組有效:
注意:預設情況下,qt包含了core 和 gui 模組,所以上面的宣告僅僅是新增xml和網路模組到預設的列表中。
比如,下面的語句就是忽略了預設模組,當編譯程式原始碼時候會導致錯誤:
假如你想編譯一個不需要gui模組的工程,你需要用“-=”操作符來去除包含。
例如:下面的語句就是小型的Qt工程會被編譯
下面的羅列顯示了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選項。
3.4 關於 CONFIG(debug, debug|release)語法
CONFIG變數可以同時定義 debug 和 release,但只有一個處於active(當兩個互斥的值都出現時,最後設定的處於active狀態)
什麼意思?怎麼理解呢?請看如下:
如上寫法,release處於active狀態。胡說吧!你咋知道呢?嗯哼?不信咱們用上面的工程測試一下。
[1] 還原測試現場。把工程資料夾proDemo同級的目錄及檔案刪除乾淨(為了驗證準確性,先還原測試實驗現場,以下類似做法意義相同)。
[2] 修改內容。把工程中的pro型別檔案改為下面的內容:
[3] 編譯構建。首先把工程qmake一下,然後構建。
好,完成測試操作。激動人心的時刻到了!這個時候,我們會發現proDemo同級目錄生成了appFile資料夾。
開啟此資料夾,發現有兩個檔案:proDemo.exe 和 proDemo.exe.embed.manifest
壞了!從pro檔案來看,我們debug和release版本生成的目標檔名稱是相同的(即TARGET值)。腫麼辦呢?為了驗證是release版本的可執行程式!
這樣吧!我們在上級目錄即proStudy資料夾中搜索*pdb檔案(除錯debug版本必生成的檔案),沒有搜尋到。OK!那就說明是Release版本。
其實,另外一種辦法,我們會發現proDemo工程資料夾同級目錄下也會生成一個build-proDemo-Desktop_Qt_5_3_MSVC2010_OpenGL_32bit-Debug名稱的資料夾(說明一點:剛剛構建程式時QT Creator的模式是Debug),而這個資料夾中會有debug和release兩個資料夾,你會發現debug檔案是空的,而release資料夾中才有內容。這點也可以說明剛剛的確生成的是release版本。
但是,上面的寫法,debug 和 release都可以通過測試,而且閱讀比較費勁,反正總感覺迷惑性太強,如何處理呢?建議寫法如下:
這種情況下,我們再來分析一下:
[1] 還原現場。清空proDemo工程目錄下除過proDemo而外的其他資料夾(同上)。
[2] 切換模式。分別切換Debug和Release版本:
[3] 編譯構建。各自執行qmake,並進行構建,再執行,可以看到同樣的窗體:
好勒~ 儘管,看起來是同樣的窗體,但是,要理解是兩個完全不同版本的應用程式。
現在看看proDemo目錄下會多出這樣兩個資料夾:demo_Debug 和 demo_Release,在其各自目錄下,可以分別發現可執行程式proDemo_Debug和proDemo_Release,即剛剛兩個窗體應用程式。
同時,會發現再沒有生成appFile資料夾,這點也可以驗證DESTDIR 後面的“=”與 “+=”的作用區別。
那麼,再回頭看 CONFIG(debug, debug|release)這種語法是什麼含義呢?
註解:兩個引數,前者是要判斷active的選項,後者是互斥的選項的一個集合。
有人覺得難道這麼麻煩?上面的例子中,生成兩種版本的應用程式,我們通過對Qt Creator構建模式進行了切換,那麼想直接生成呢?
可以直接加選項build_all。比如,可以把pro檔案改為這樣的內容:
然後清空工程資料夾同級其它目錄,再qmake一下,編譯後,可以看到不用切換Qt Creator情況下,也我們一次性同時生成了兩種版本的可執行程式。
【3】Qt Creator建立工程的pro檔案
下面分別把Qt Creator新建的不同型別工程預設的pro檔案羅列一下,可以參考學習:
3.1 新建proDemo1工程(注意:模板選擇,專案:應用程式;Qt Widgets Application)。步驟如下:Qt Creator--->New Project--->應用程式--->Qt Widgets Application--->名稱為:proDemo1(建立路徑自己擬定,本地為F:\Source\proStudy)--->類資訊保持不變--->完成。對應的pro檔案如下:
此pro檔案其實與本文第一張圖片相同。因為所建工程相同,預設pro檔案也相同。
3.2 新建proDemo2工程(注意:模板選擇,專案:應用程式;Qt Quick Application)。步驟如下:Qt Creator--->New Project--->應用程式--->Qt Quick Application--->名稱為:proDemo2(建立路徑自己擬定,本地為F:\Source\proStudy)--->Qt Quick component set : Qt Quick Controls1.2--->完成。對應的pro檔案如下:
此pro檔案利用include引入了pri型別的檔案。
3.3 新建proDemo3工程(注意:模板選擇,專案:應用程式;Qt 控制檯應用)。步驟如下:Qt Creator--->New Project--->應用程式--->Qt 控制檯應用--->名稱為:proDemo3(建立路徑自己擬定,本地為F:\Source\proStudy)--->類資訊保持不變--->完成。對應的pro檔案如下:
此pro檔案去掉了CONFIG配置變數預設的app_bundle項,由於是控制檯應用程式。
3.4 新建proDemo4工程(注意:模板選擇,專案:庫;C++庫)。步驟如下:Qt Creator--->New Project--->庫--->C++ 庫--->名稱為:proDemo4(建立路徑自己擬定,本地為F:\Source\proStudy)--->型別:共享庫--->其他項均預設--->完成。對應的pro檔案如下:
此pro檔案添加了unix環境的控制。
3.5 新建proDemo5工程(注意:模板選擇,專案:庫;C++庫)。步驟如下:Qt Creator--->New Project--->庫--->C++ 庫--->名稱為:proDemo5(建立路徑自己擬定,本地為F:\Source\proStudy)--->型別:靜態連結庫--->其他項均預設--->完成。對應的pro檔案如下:
此pro檔案與3.4工程的最大區別是為配置變數CONFIG添加了staticlib值,因為工程型別選擇為靜態連結庫。
3.6 新建proDemo6工程(注意:模板選擇,專案:庫;C++庫)。步驟如下:Qt Creator--->New Project--->庫--->C++ 庫--->名稱為:proDemo6(建立路徑自己擬定,本地為F:\Source\proStudy)--->型別:Qt Plugin--->其他項均預設--->完成。對應的pro檔案如下:
此pro檔案新增其他檔案OTHER_FILES配置變數,另外,配置變數CONFIG添加了plugin值,因為工程型別選擇為Qt Plugin。
3.7 新建proDemo7工程(注意:模板選擇,專案:其他專案;Qt單元測試)。步驟如下:Qt Creator--->New Project--->其他專案--->Qt單元測試--->名稱為:proDemo7(建立路徑自己擬定,本地為F:\Source\proStudy)--->其他項均預設--->完成。對應的pro檔案如下:
此pro檔案為QT變數新增testlib值。
3.8 新建proDemo8工程(注意:模板選擇,專案:其他專案;Qt4設計師自定義控制元件)。步驟如下:Qt Creator--->New Project--->其他專案--->Qt4設計師自定義控制元件--->名稱為:proDemo8(建立路徑自己擬定,本地為F:\Source\proStudy)--->控制元件類:customControl--->其他項全部預設--->完成。對應的pro檔案如下: