Qt的.pro工程文件语法学习
我們編寫Qt應用程序時,不管使用Qt Creator還是VS或者Eclipse,不管是Qt Widgets還是Qt Quick,總會發現有.pro文件,我們稱.pro文件為Qt的工程管理文件,它存在的目的是列舉工程中包含的源文件。類似于makefile,一個工程中可以包含一個或多個.pro文件。因此對于使用Qt的開發人員來說,熟悉.pro工程文件的語法,懂得閱讀和修改.pro文件,將有利于對項目工程的文件組織和管理。
qmake、.pro文件、makefile文件的關系簡單來說就是:
qmake工具使用了與平臺無關的.pro文件生成與平臺相關的makefile文件。
所以雖然本文標題為.pro文件語法學習,實際上應該是qmake的語法學習,但是因為IDE把qmake隱藏起來了,我們接觸地更多的是.pro文件,因此還是使用這樣的標題。
================================
TARGET變量 & TEMPLATE變量 & CONFIG變量:
首先我們需要知道工程文件主要分為三種:app(單獨的應用程序)、lib(靜態或動態庫)和subdirs(遞歸編譯)。工程文件的類型可以使用TEMPLATE變量來指定。
TARGET是用來定義應用程序的名字的,而程序的擴展名則由TEMPLATE來定義。例如:TARGET = hello,TEMPLATE = app,則在Linux下會生成hello(無后綴的ELF可執行文件),對應的在Windows下會生成hello.exe。
TEMPLATE和CONFIG共同定義了目標類型,以下是幾種常見情況:
- TEMPLATE = app,生成標準程序(注意如果沒有TEMPLATE這一項,那么默認工程就是app)。
- TEMPLATE = subdirs,子項目工程模板,可以用它來創建一個能夠進入特定目錄并且編譯子目錄里的目標文件。此時除了TEMPLATE = subdirs,還需要指定SUBDIRS變量,在每個子目錄中,qmake會搜尋以目錄命名的.pro文件,并且會編譯該工程。
- TEMPLATE = lib,生成庫文件,若不指定CONFIG變量,則編譯為共享庫;若CONFIG += staticlib,則編譯為靜態庫;若CONFIG += plugin,則編譯為插件(插件總是動態庫)。
對于app或者lib工程,以下是較常使用的一些變量:
- TARGET變量:指定可執行文件或庫的基本文件名,其中不包含任何的擴展、前綴或版本號。(默認的是當前的目錄名)
- CONFIG變量:指定各種用于工程配置和編譯的參數
- HEADERS變量:指定工程的C++頭文件(.h)
- SOURCES變量:指定工程的C++實現文件(.cpp)
- FORMS變量:指定需要uic處理的由Qt設計師生成的.ui文件
- RESOURCES變量:指定需要rcc處理的.qrc文件(資源文件)
- LEXSOURCES變量:指定工程的lex源文件(.l)
- YACCSOURCES變量:指定工程中的yacc源文件(.y)
- DEFINES變量:指定預定義的C++預處理器符號
- INCLUDEPATH變量:指定C++編譯器搜索全局頭文件的路徑
- LIBS變量:指定工程要鏈接的庫。庫既可以通過絕對路徑指定,也可以使用源自Unix的-L和-l標識符來指定(例如:-L/usr/local/lib和-ldb_cxx)
- QT變量:指定工程所要使用的Qt模塊(默認的是core gui,對應于QtCore和QtGui模塊)
- VERSION變量:指定目標庫的版本號
- DESTDIR變量:指定生成的可執行文件放置的目錄。(默認值是平臺相關的,例如在Linux上,值當前目錄;在Windows上,則是指debug或release子目錄)
- DLLDESTDIR變量:指定目標庫文件放置的目錄(默認與DESTDIR相同)
- OBJECTS_DIR變量:指定目標文件(.o文件)的存放目錄
.pro文件中的注釋:
注釋以井號(#)開頭,在行尾處結束。
.pro文件中的一個條目的語法通常具有如下形式:
variable = valuesvalues是字符串的列表,例如:CONFIG = qt release warn_off,是指將列表 [“qt”, “release”, “warn_off”] 賦給CONFIG變量,注意!它會覆蓋CONFIG變量以前設置的各個值。因此我們通常用 += 操作符來擴展變量的值。如:
CONFIG = qt CONFIG += release CONFIG += warn_off同樣,我們也可以用 -= 操作符從當前的變量中移除任意的指定值。如:
CONFIG = qt release warn_off CONFIG -= qt會使CONFIG變量的值變成 [“release”, “warn_off”]。
另外還有 = 操作符和 ~= 操作符。= 操作符在一個變量上添加一個值,但要求被添加的值不在變量的列表上,否則將不做任何事情。例如:
這一行將把main.cpp文件添加到工程中,只有當它還沒有被添加的情況下才會添加。
最后,~= 操作符使用指定的值替換符合正則表達式的值,這是sed的語法。例如:
使用.cxx替換SOURCES變量中所有.cpp文件的擴展名。
除了使用qmake定義的標準變量外,我們也可以設置任意變量和值,并且可以使用$$varName 或者 $${varName} 語法引用它。例如:
MY_VERSION = 2.0 TARGET = Hello_$${MY_VERSION} 使用 $${PWD} 可以獲取當前文件所在的目錄路徑。
使用內置函數 $$lower() 可以把字符串轉換為小寫。
而內置函數$$system() 允許我們從外部應用程序中產生字符串,例如想要確認當前的UNIX版本,可以這樣寫:
然后,可以在條件中使用結果變量,并與contains()合用:
contains(OS_VERSION, SunOS): SOURCES += mythread_sun.c 有時候可能需要在.pro文件中指定包含空格的文件名。在這種情況下,只需要簡單地把文件名用引號括起來即可。
當在不同平臺上編譯工程時,可能有必要基于平臺指定不同的文件或者不同的參數。qmake的條件判斷語法是:
condition部分可以是平臺名字(例如:win32、unix或者macx),或者更復雜的斷言。then-case和else-case部分使用標準語法為變量賦值。例如:
win32 {SOURCES += serial_win.cpp } else {SOURCES += serial_unix.cpp }else分支是可選的。為了方便,當then-case部分僅有一條變量賦值,而且在沒有else-case分支時,qmake也支持單行形式的語法。例如:
macx: SOURCES += serial_mac.cpp如果有幾個工程文件需要共享相同的項,則可以把相同的項提取到單獨的文件中,在各自的.pro文件中使用include()語句包含它們。例如:
include(../common.pri)通常,打算被別的工程文件所包含的工程文件會帶有.pri(工程包含)的擴展名。
================================
我們這里提到的一些qmake常用語法,但相對于強大的qmake工具本身提供參數和特性,本文也只是冰山一角,因此如果想對qmake作更多了解,可以參考qmake指南的在線幫助文檔。
總結
以上是生活随笔為你收集整理的Qt的.pro工程文件语法学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷P4084 [USACO17DEC]
- 下一篇: Markdown语法学习