您好,登錄后才能下訂單哦!
工作中,感覺pro文件的有些內容真不太懂,現系統性的學習一下。于此備錄,分享共勉。
為了更好的理解,先創建一個簡單的工程作為實踐。
【1】創建一個pro文件
1.1 新建proDemo工程。步驟如下:Qt Creator--->New Project--->應用程序--->Qt Widgets Application--->名稱為:proDemo(創建路徑自己擬定,本地為F:\Source\proStudy)--->類信息保持不變--->完成
1.2 提取pro文件。在工程目錄下,把名稱為proDemo且類型為pro的文件找到,內容如下所示:
不懂?呵呵~ 我也不懂,先學習一下,pro文件分析如下:
【2】模板變量
2.1 模板變量 TEMPLATE
模板變量作用告訴qmake為這個應用程序具體生成哪種makefile。下面是模板變量可供選擇的值:
[1]app 模板變量的默認值。建立一個應用程序的makefile。
[2]lib 建立一個庫的makefile。
[3]vcapp 建立一個應用程序的Visual Studio項目文件。
[4]vclib 建立一個庫的VisualStudio項目文件。
[5]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會為所需的系統變量提供默認值。
例如,上例中的項目pro文件也可寫成這樣:
注意:如果條目是單值的,比如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文件如下:
此pro文件中當Qt版本大于4.0時為QT變量添加值designer。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。