您好,登錄后才能下訂單哦!
工作中,感覺pro文件的有些內(nèi)容真不太懂,現(xiàn)系統(tǒng)性的學(xué)習(xí)一下。于此備錄,分享共勉。
為了更好的理解,先創(chuàng)建一個簡單的工程作為實踐。
【1】創(chuàng)建一個pro文件
1.1 新建proDemo工程。步驟如下:Qt Creator--->New Project--->應(yīng)用程序--->Qt Widgets Application--->名稱為:proDemo(創(chuàng)建路徑自己擬定,本地為F:\Source\proStudy)--->類信息保持不變--->完成
1.2 提取pro文件。在工程目錄下,把名稱為proDemo且類型為pro的文件找到,內(nèi)容如下所示:
不懂?呵呵~ 我也不懂,先學(xué)習(xí)一下,pro文件分析如下:
【2】模板變量
2.1 模板變量 TEMPLATE
模板變量作用告訴qmake為這個應(yīng)用程序具體生成哪種makefile。下面是模板變量可供選擇的值:
[1]app 模板變量的默認值。建立一個應(yīng)用程序的makefile。
[2]lib 建立一個庫的makefile。
[3]vcapp 建立一個應(yīng)用程序的Visual Studio項目文件。
[4]vclib 建立一個庫的VisualStudio項目文件。
[5]subdirs 這是一個特殊的模板,它可以創(chuàng)建一個能夠進入特定目錄且為一個項目文件生成makefile,還能為它再調(diào)用make的makefile。
由以上分析可知,模板變量值不同,生成的makefile文件也會隨之改變。那么,默認的同時是最常用的app值,模板請參見下文。
2.2 app模板
app模板告訴qmake為建立一個應(yīng)用程序生成一個makefile。
當使用這個模板時,設(shè)置下面這些qmake系統(tǒng)變量值是有效的??梢栽谀愕?pro文件中使用它們?yōu)槟愕膽?yīng)用程序指定特定信息。
HEADERS - 應(yīng)用程序中的所有頭文件的列表。
SOURCES - 應(yīng)用程序中的所有源文件的列表。
FORMS - 應(yīng)用程序中的所有.ui文件(由Qt設(shè)計器生成)的列表。
LEXSOURCES - 應(yīng)用程序中的所有l(wèi)ex源文件的列表。
YACCSOURCES - 應(yīng)用程序中的所有yacc源文件的列表。
TARGET - 可執(zhí)行應(yīng)用程序的名稱。默認值為項目文件的名稱。(如果需要擴展名,會被自動加上。)
DESTDIR - 放置可執(zhí)行程序目標的目錄。
DEFINES - 應(yīng)用程序所需的額外的預(yù)處理程序定義的列表。
INCLUDEPATH - 應(yīng)用程序所需的額外的包含路徑的列表。
DEPENDPATH - 應(yīng)用程序所依賴的搜索路徑。
VPATH - 尋找補充文件的搜索路徑。
DEF_FILE - 只有Windows需要:應(yīng)用程序所要連接的.def文件。
RC_FILE - 只有Windows需要:應(yīng)用程序的資源文件。
RES_FILE - 只有Windows需要:應(yīng)用程序所要連接的資源文件。
你只需要使用那些你已經(jīng)有值的系統(tǒng)變量。例如,如果你不需要任何額外的INCLUDEPATH,那么你就不需要指定它,qmake會為所需的系統(tǒng)變量提供默認值。
例如,上例中的項目pro文件也可寫成這樣:
注意:如果條目是單值的,比如template或者目的目錄DESTDIR(可執(zhí)行文件或二進制文件的發(fā)布目錄),我們是用“=”,但如果是多值條目,我們使用“+=”來為這個變量添加現(xiàn)有的條目值。
使用“=”會用新值替換原有的值。例如,如果我們寫了DEFINES = QT_DLL,其它DEFINES所有的條目值都將被刪除并用QT_DLL替代。
2.3 lib模板
lib模板告訴qmake為建立一個庫而生成一個makefile。當使用這個模板時,除了app模板中提到的系統(tǒng)變量外,還有一個VERSION是被支持的。
你需要在為庫指定特定信息的.pro文件中使用它們。VERSION - 目標庫的版本號。比如,2.3.1。
2.4 subdirs模板
subdirs模板告訴qmake生成一個makefile,它可以進入到特定子目錄并為這個目錄中的項目文件生成makefile并且為它調(diào)用make。
在這個模板中只有一個系統(tǒng)變量SUBDIRS可以被識別。這個變量中包含了所要處理的含有項目文件的子目錄的列表。這個項目文件的名稱是和子目錄同名的,這樣qmake就可以發(fā)現(xiàn)它。
例如,如果子目里是“myapp”,那么在這個目錄中的項目文件應(yīng)該被叫做myapp.pro。
【3】配置變量CONFIG
配置變量CONFIG 指定了編譯器所要使用的選項和所需要被連接的庫。配置變量中可以添加任何東西,但只有下面這些選項可以被qmake識別。
3.1 控制編譯器
下面這些選項控制著使用哪些編譯器標志:
release - 應(yīng)用程序?qū)⒁詒elease模式連編。如果“debug”被指定,它將被忽略。
debug - 應(yīng)用程序?qū)⒁詃ebug模式連編(與release互斥)。
debug_and_release - 工程同時用調(diào)試和發(fā)布模式編譯。
build_all - 如果指定是debug_and_release模式,工程默認是同時用調(diào)試和發(fā)布模式編譯。
ordered - 使用subdirs模板時,本選項指定了子目錄應(yīng)該按照給出的順序編譯。
warn_on - 編譯器會輸出盡可能多的警告信息。如果“warn_off”被指定,它將被忽略。
warn_off - 編譯器會輸出盡可能少的警告信息(與warn_on互斥)。
3.2 連編類型
下面這些選項定義了所要連編的庫/應(yīng)用程序的類型:
qt - 應(yīng)用程序是一個Qt應(yīng)用程序,并且Qt庫將會被鏈接。
thread - 應(yīng)用程序是一個多線程應(yīng)用程序。
x11 - 應(yīng)用程序是一個X11應(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選項生效。
例如,如果你的應(yīng)用程序使用Qt庫,并且你想把它連編為一個可調(diào)試的多線程的應(yīng)用程序,你的項目文件應(yīng)該會有下面這行:
注意,你必須使用“+=”,不要使用“=”,否則qmake就不能正確使用連編Qt的設(shè)置了,比如沒法獲得所編譯的Qt庫的類型了。
3.3 聲明QT庫模塊
如果CONFIG變量值中包含了qt這個值,qmake支持了qt的程序(因為qmake也可以用在非qt程序的編譯)這就要調(diào)整一些你程序中使用的qt的模塊,而QT變量,正是達到這個目的的。QT是用來聲明使用到的一些額外的模塊,例如:通過下面的方法使得xml和網(wǎng)絡(luò)模塊有效:
注意:默認情況下,qt包含了core 和 gui 模塊,所以上面的聲明僅僅是添加xml和網(wǎng)絡(luò)模塊到默認的列表中。
比如,下面的語句就是忽略了默認模塊,當編譯程序源碼時候會導(dǎo)致錯誤:
假如你想編譯一個不需要gui模塊的工程,你需要用“-=”操作符來去除包含。
例如:下面的語句就是小型的Qt工程會被編譯
下面的羅列顯示了QT變量可以使用的選項,并解釋了相應(yīng)的特點:
core (included by default) QtCore module 核心模塊
gui (included by default) QtGui module 界面模塊
network QtNetwork module 支持網(wǎng)絡(luò)模塊
opengl QtOpenGL module 支持opengl圖像編程
sql QtSql module 支持sql數(shù)據(jù)庫驅(qū)動
svg QtSvg module 支持svg矢量圖形
xml QtXml module 支持xml模塊
qt3support Qt3Support module 支持qt3類
注意:添加opengl到QT變量里面,等價于往CONFIG變量里面添加。
所以對于Qt應(yīng)用程序來說,沒必要同時往QT變量和CONFIG變量里面添加opengl選項。
3.4 關(guān)于 CONFIG(debug, debug|release)語法
CONFIG變量可以同時定義 debug 和 release,但只有一個處于active(當兩個互斥的值都出現(xiàn)時,最后設(shè)置的處于active狀態(tài))
什么意思?怎么理解呢?請看如下:
如上寫法,release處于active狀態(tài)。胡說吧!你咋知道呢?嗯哼?不信咱們用上面的工程測試一下。
[1] 還原測試現(xiàn)場。把工程文件夾proDemo同級的目錄及文件刪除干凈(為了驗證準確性,先還原測試實驗現(xiàn)場,以下類似做法意義相同)。
[2] 修改內(nèi)容。把工程中的pro類型文件改為下面的內(nèi)容:
[3] 編譯構(gòu)建。首先把工程qmake一下,然后構(gòu)建。
好,完成測試操作。激動人心的時刻到了!這個時候,我們會發(fā)現(xiàn)proDemo同級目錄生成了appFile文件夾。
打開此文件夾,發(fā)現(xiàn)有兩個文件:proDemo.exe 和 proDemo.exe.embed.manifest
壞了!從pro文件來看,我們debug和release版本生成的目標文件名稱是相同的(即TARGET值)。腫么辦呢?為了驗證是release版本的可執(zhí)行程序!
這樣吧!我們在上級目錄即proStudy文件夾中搜索*pdb文件(調(diào)試debug版本必生成的文件),沒有搜索到。OK!那就說明是Release版本。
其實,另外一種辦法,我們會發(fā)現(xiàn)proDemo工程文件夾同級目錄下也會生成一個build-proDemo-Desktop_Qt_5_3_MSVC2010_OpenGL_32bit-Debug名稱的文件夾(說明一點:剛剛構(gòu)建程序時QT Creator的模式是Debug),而這個文件夾中會有debug和release兩個文件夾,你會發(fā)現(xiàn)debug文件是空的,而release文件夾中才有內(nèi)容。這點也可以說明剛剛的確生成的是release版本。
但是,上面的寫法,debug 和 release都可以通過測試,而且閱讀比較費勁,反正總感覺迷惑性太強,如何處理呢?建議寫法如下:
這種情況下,我們再來分析一下:
[1] 還原現(xiàn)場。清空proDemo工程目錄下除過proDemo而外的其他文件夾(同上)。
[2] 切換模式。分別切換Debug和Release版本:
[3] 編譯構(gòu)建。各自執(zhí)行qmake,并進行構(gòu)建,再運行,可以看到同樣的窗體:
好勒~ 盡管,看起來是同樣的窗體,但是,要理解是兩個完全不同版本的應(yīng)用程序。
現(xiàn)在看看proDemo目錄下會多出這樣兩個文件夾:demo_Debug 和 demo_Release,在其各自目錄下,可以分別發(fā)現(xiàn)可執(zhí)行程序proDemo_Debug和proDemo_Release,即剛剛兩個窗體應(yīng)用程序。
同時,會發(fā)現(xiàn)再沒有生成appFile文件夾,這點也可以驗證DESTDIR 后面的“=”與 “+=”的作用區(qū)別。
那么,再回頭看 CONFIG(debug, debug|release)這種語法是什么含義呢?
注解:兩個參數(shù),前者是要判斷active的選項,后者是互斥的選項的一個集合。
有人覺得難道這么麻煩?上面的例子中,生成兩種版本的應(yīng)用程序,我們通過對Qt Creator構(gòu)建模式進行了切換,那么想直接生成呢?
可以直接加選項build_all。比如,可以把pro文件改為這樣的內(nèi)容:
然后清空工程文件夾同級其它目錄,再qmake一下,編譯后,可以看到不用切換Qt Creator情況下,也我們一次性同時生成了兩種版本的可執(zhí)行程序。
【3】Qt Creator創(chuàng)建工程的pro文件
下面分別把Qt Creator新建的不同類型工程默認的pro文件羅列一下,可以參考學(xué)習(xí):
3.1 新建proDemo1工程(注意:模板選擇,項目:應(yīng)用程序;Qt Widgets Application)。步驟如下:Qt Creator--->New Project--->應(yīng)用程序--->Qt Widgets Application--->名稱為:proDemo1(創(chuàng)建路徑自己擬定,本地為F:\Source\proStudy)--->類信息保持不變--->完成。對應(yīng)的pro文件如下:
此pro文件其實與本文第一張圖片相同。因為所建工程相同,默認pro文件也相同。
3.2 新建proDemo2工程(注意:模板選擇,項目:應(yīng)用程序;Qt Quick Application)。步驟如下:Qt Creator--->New Project--->應(yīng)用程序--->Qt Quick Application--->名稱為:proDemo2(創(chuàng)建路徑自己擬定,本地為F:\Source\proStudy)--->Qt Quick component set : Qt Quick Controls1.2--->完成。對應(yīng)的pro文件如下:
此pro文件利用include引入了pri類型的文件。
3.3 新建proDemo3工程(注意:模板選擇,項目:應(yīng)用程序;Qt 控制臺應(yīng)用)。步驟如下:Qt Creator--->New Project--->應(yīng)用程序--->Qt 控制臺應(yīng)用--->名稱為:proDemo3(創(chuàng)建路徑自己擬定,本地為F:\Source\proStudy)--->類信息保持不變--->完成。對應(yīng)的pro文件如下:
此pro文件去掉了CONFIG配置變量默認的app_bundle項,由于是控制臺應(yīng)用程序。
3.4 新建proDemo4工程(注意:模板選擇,項目:庫;C++庫)。步驟如下:Qt Creator--->New Project--->庫--->C++ 庫--->名稱為:proDemo4(創(chuàng)建路徑自己擬定,本地為F:\Source\proStudy)--->類型:共享庫--->其他項均默認--->完成。對應(yīng)的pro文件如下:
此pro文件添加了unix環(huán)境的控制。
3.5 新建proDemo5工程(注意:模板選擇,項目:庫;C++庫)。步驟如下:Qt Creator--->New Project--->庫--->C++ 庫--->名稱為:proDemo5(創(chuàng)建路徑自己擬定,本地為F:\Source\proStudy)--->類型:靜態(tài)鏈接庫--->其他項均默認--->完成。對應(yīng)的pro文件如下:
此pro文件與3.4工程的最大區(qū)別是為配置變量CONFIG添加了staticlib值,因為工程類型選擇為靜態(tài)鏈接庫。
3.6 新建proDemo6工程(注意:模板選擇,項目:庫;C++庫)。步驟如下:Qt Creator--->New Project--->庫--->C++ 庫--->名稱為:proDemo6(創(chuàng)建路徑自己擬定,本地為F:\Source\proStudy)--->類型:Qt Plugin--->其他項均默認--->完成。對應(yīng)的pro文件如下:
此pro文件添加其他文件OTHER_FILES配置變量,另外,配置變量CONFIG添加了plugin值,因為工程類型選擇為Qt Plugin。
3.7 新建proDemo7工程(注意:模板選擇,項目:其他項目;Qt單元測試)。步驟如下:Qt Creator--->New Project--->其他項目--->Qt單元測試--->名稱為:proDemo7(創(chuàng)建路徑自己擬定,本地為F:\Source\proStudy)--->其他項均默認--->完成。對應(yīng)的pro文件如下:
此pro文件為QT變量添加testlib值。
3.8 新建proDemo8工程(注意:模板選擇,項目:其他項目;Qt4設(shè)計師自定義控件)。步驟如下:Qt Creator--->New Project--->其他項目--->Qt4設(shè)計師自定義控件--->名稱為:proDemo8(創(chuàng)建路徑自己擬定,本地為F:\Source\proStudy)--->控件類:customControl--->其他項全部默認--->完成。對應(yīng)的pro文件如下:
此pro文件中當Qt版本大于4.0時為QT變量添加值designer。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。