Qt pro 檔案詳解
1. TEMPLATE
變量TEMPLATE描述了為建立目标檔案而采用何種模闆,即生成何種形式的Makefile檔案。Qmake
工具定義了5種模闆:
a. 應用程式App,為建立一個Qt應用程式建立Makefile檔案;
b. 庫lib,為建立引用程式庫而建立Makefile檔案;
c. 子工程 subdirs,為建立子目錄下的目标檔案建立一個Makefile檔案,
子目錄通過變量SUBDIRS指定(子目錄下的工程檔案也需要指出使用何種模闆);
d. VC應用程式vcapp,為Visual Studio 生成一個應用程式工程,僅僅用語Windos作業系統.
e. VC庫vclib,為Visual Studio生成一個應用程式庫工程,僅僅用語Windows作業系統.
{
app - 建立一個應用程式的makefile。這是預設值,是以如果模闆沒有被指定,這個将被使用。
lib - 建立一個庫的makefile。
vcapp - 建立一個應用程式的Visual Studio項目檔案。
vclib - 建立一個庫的Visual Studio項目檔案。
subdirs - 這是一個特殊的模闆,它可以建立一個能夠進入特定目錄并且為一個項目檔案生成makefile并且為它調用make的makefile。
“app”模闆
“app”模闆告訴qmake為建立一個應用程式生成一個makefile。當使用這個模闆時,下面這些qmake系統變量是被承認的。你應該在你的.pro檔案中使用它們來為你的應用程式指定特定資訊。
}
2.HEADERS - 應用程式中的所有頭檔案的清單。
3.SOURCES - 應用程式中的所有源檔案的清單。
4.FORMS / INTERFACES - 應用程式中的所有.ui檔案(由Qt設計器生成)的清單。 eg.INTERFACES = filename.ui
5.LEXSOURCES - 應用程式中的所有lex源檔案的清單。
6.YACCSOURCES - 應用程式中的所有yacc源檔案的清單。
7.TARGET - 可執行應用程式的名稱。預設值為項目檔案的名稱。(如果需要擴充名,會被自動加上。)
8.DESTDIR - 放置可執行程式目标的目錄。
9.DEFINES - 應用程式所需的額外的預處理程式定義的清單。
10.INCLUDEPATH - 應用程式所需的額外的包含路徑的清單(include檔案路徑清單)。
11.DEPENDPATH - 應用程式所依賴的搜尋路徑(描述了建立應用程式所依賴的其他檔案所在的路 徑)。
12.VPATH - 尋找補充檔案的搜尋路徑。
13.DEF_FILE - 隻有Windows需要:應用程式所要連接配接的.def檔案。
14.C_FILE - 隻有Windows需要:應用程式的資源檔案。
15.RES_FILE - 隻有Windows需要:應用程式所要連接配接的資源檔案。
16.CONFIG變量
配置變量指定了編譯器所要使用的選項和所需要被連接配接的庫。配置變量中可以添加任何東西,但隻有下面這些選項可以被qmake識别。
下面這些選項控制着使用哪些編譯器标志:
release - 應用程式将以release模式連編。如果“debug”被指定,它将被忽略。
debug - 應用程式将以debug模式連編。
warn_on - 編譯器會輸出盡可能多的警告資訊。如果“warn_off”被指定,它将被忽略。
warn_off - 編譯器會輸出盡可能少的警告資訊。
eg.
CONFIG += qt warn_on release
在這裡使用“+=”,是因為我們添加我們的配置選項到任何一個已經存在中。這樣做比使用“=”那樣替換已經指定的所有選項是更安全的。
A> qt部分告訴qmake這個應用程式是使用Qt來連編的。這也就是說qmake在連接配接和為編譯添加所需的包含路徑的時候會考慮到Qt庫的。
B> warn_on部分告訴qmake要把編譯器設定為輸出警告資訊的。
C> release部分告訴qmake應用程式必須被連編為一個釋出的應用程式。在開發過程中,程式員也可以使用debug來替換release
下面這些選項定義了所要連編的庫/應用程式的類型:
qt - 應用程式是一個Qt應用程式,并且Qt庫将會被連接配接。
thread - 應用程式是一個多線程應用程式。
x11 - 應用程式是一個X11應用程式或庫。
windows - 隻用于“app”模闆:應用程式是一個Windows下的視窗應用程式。
console - 隻用于“app”模闆:應用程式是一個Windows下的控制台應用程式。
dll - 隻用于“lib”模闆:庫是一個共享庫(dll)。
staticlib - 隻用于“lib”模闆:庫是一個靜态庫。
plugin - 隻用于“lib”模闆:庫是一個插件,這将會使dll選項生效。
例如,如果你的應用程式使用Qt庫,并且你想把它連編為一個可調試的多線程的應用程式,你的項目檔案應該會有下面這行:
CONFIG += qt thread debug注意,你必須使用“+=”,不要使用“=”,否則qmake就不能正确使用連編Qt的設定了,比如沒法獲得所編譯的Qt庫的類型了。
qmake進階概念
操作符
“=”操作符 配置設定一個值給一個變量
“+=”操作符 向一個變量的值的清單中添加一個值
“-=”操作符 從一個變量的值的清單中移去一個值
“*=”操作符 僅僅在一個值不存在于一個變量的值的清單中的時候,把它添加進去
“~=”操作符 替換任何與指定的值的正規表達式比對的任何值 DEFINES ~= s/QT_[DT].+/QT
作用域(指定平台相關性等操作)
win32:thread {
DEFINES += QT_THREAD_SUPPORT
}
else:debug {
DEFINES += QT_NOTHREAD_DEBUG
}
else {
warning("Unknown configuration")
}
}
變量
到目前為止我們遇到的變量都是系統變量,比如DEFINES、SOURCES和HEADERS。你也可以為你自己建立自己的變量,這樣你就可以在作用域中使用它們了。建立自己的變量很容易,隻要命名它并且配置設定一些東西給它。比如:
MY_VARIABLE = value
你也可以通過在其它任何一個變量的變量名前加$$來把這個變量的值配置設定給目前的變量。例如:
MY_DEFINES = $$DEFINESMY_DEFINES = $${DEFINES}
第二種方法允許你把一個變量和其它變量連接配接起來,而不用使用空格。qmake将允許一個變量包含任何東西(包括$(VALUE),可以直接在 makefile中直接放置,并且允許它适當地擴張,通常是一個環境變量)。無論如何,如果你需要立即設定一個環境變量,然後你就可以使用$$()方法。 比如:
MY_DEFINES = $$(ENV_DEFINES)這将會設定MY_DEFINES為環境變量ENV_DEFINES傳遞給.pro檔案地值。另外你可以在替換的變量裡調用内置函數。這些函數(不會和下一節中列舉的測試函數混淆)列出如下:
join( variablename, glue, before, after )
這将會在variablename的各個值中間加入glue。如果這個變量的值為非空,那麼就會在值的前面加一個字首before和一個字尾after。 隻有variablename是必須的字段,其它預設情況下為空串。如果你需要在glue、before或者after中使用空格的話,你必須提供它們。
member( variablename, position )
這将會放置variablename的清單中的position位置的值。如果variablename不夠長,這将會傳回一個空串。variablename是唯一必須的字段,如果沒有指定位置,則預設為清單中的第一個值。
find( variablename, substr )
這将會放置variablename中所有比對substr的值。substr也可以是正規表達式,而是以将被比對。
MY_VAR = one two three four MY_VAR2 = $$join(MY_VAR, " -L", -L) -Lfive MY_VAR3 = $$member(MY_VAR, 2) $$find(MY_VAR, t.*)MY_VAR2将會包含“-Lone -Ltwo -Lthree -Lfour -Lfive”,并且MYVAR3将會包含“three two three”。
system( program_and_args )
這将會傳回程式執行在标準輸出/标準錯誤輸出的内容,并且正像平時所期待地分析它。比如你可以使用這個來詢問有關平台的資訊。
UNAME = $$system(uname -s) contains( UNAME, [lL]inux ):message( This looks like Linux ($$UNAME) to me )測試函數
qmake提供了可以簡單執行,但強大測試的内置函數。這些測試也可以用在作用域中(就像上面一樣),在一些情況下,忽略它的測試值,它自己使用測試函數是很有用的。
contains( variablename, value )
如果value存在于一個被叫做variablename的變量的值的清單中,那麼這個作用域中的設定将會被處理。例如:
contains( CONFIG, thread ) { DEFINES += QT_THREAD_SUPPORT }如果thread存在于CONFIG變量的值的清單中時,那麼QT_THREAD_SUPPORT将會被加入到DEFINES變量的值的清單中。
count( variablename, number )
如果number與一個被叫做variablename的變量的值的數量一緻,那麼這個作用域中的設定将會被處理。例如:
count( DEFINES, 5 ) { CONFIG += debug }error( string )
這個函數輸出所給定的字元串,然後會使qmake退出。例如:
error( "An error has occured" )文本“An error has occured”将會被顯示在控制台上并且qmake将會退出。
exists( filename )
如果指定檔案存在,那麼這個作用域中的設定将會被處理。例如:
exists( /local/qt/qmake/main.cpp ) { SOURCES += main.cpp }如果/local/qt/qmake/main.cpp存在,那麼main.cpp将會被添加到源檔案清單中。
注意可以不用考慮平台使用“/”作為目錄的分隔符。
include( filename )
項目檔案在這一點時包含這個檔案名的内容,是以指定檔案中的任何設定都将會被處理。例如:
include( myotherapp.pro )myotherapp.pro項目檔案中的任何設定現在都會被處理。
isEmpty( variablename )
這和使用count( variablename, 0 )是一樣的。如果叫做variablename的變量沒有任何元素,那麼這個作用域中的設定将會被處理。例如:
isEmpty( CONFIG ) { CONFIG += qt warn_on debug }message( string )
這個函數隻是簡單地在控制台上輸出消息。
message( "This is a message" )文本“This is a message”被輸出到控制台上并且對于項目檔案的處理将會繼續進行。
system( command )
特定指令被執行并且如果它傳回一個1的退出值,那麼這個作用域中的設定将會被處理。例如:
system( ls /bin ) { SOURCES += bin/main.cpp HEADERS += bin/main.h }是以如果指令ls /bin傳回1,那麼bin/main.cpp将被添加到源檔案清單中并且bin/main.h将被添加到頭檔案清單中。
infile( filename, var, val )
如果filename檔案(當它被qmake自己解析時)包含一個值為val的變量var,那麼這個函數将會傳回成功。你也可以不傳遞第三個參數(val),這時函數将隻測試檔案中是否配置設定有這樣一個變量var。
以下為我的一個項目舉例
# 項目目标:為一個庫檔案
TEMPLATE = lib
# 編譯項目檔案所需頭檔案的路徑
INCLUDEPATH += ../common .
# 目标檔案路徑
DESTDIR=../lib
# 條件依賴:Unix平台上 定義本項目的 UI目錄, MOC目錄, 目的目錄
unix {
UI_DIR = ../.ui
MOC_DIR = ../.moc
OBJECTS_DIR = ../.obj
}
# 本項目配置:
CONFIG += qt warn_on release thread
# Input 頭檔案 ,源檔案
HEADERS += COMControllerThread.h \
DecodeSMS.h \
monitor_common.h \
monitor_interface.h \
MonitorThread.h \
UserEvent.h \
MyCOM.h \
MySMS.h \
MyTagHandle.h \
SMSParseThread.h \
tag_dict.h
SOURCES += COMControllerThread.cpp \
DecodeSMS.cpp \
monitor_common.cpp \
monitor_interface.cpp \
MonitorThread.cpp \
MyCOM.cpp \
MySMS.cpp \
MyTagHandle.cpp \
SMSParseThread.cpp \
tag_dict.cpp
注:qmake -project 可以生成pro檔案(可以根據項目需要,編輯改檔案)
qmake 可以生成Makefile檔案
make 編譯
使用qmake -project時,會把本目錄及其子目錄内所有.cpp .h檔案加入到項目輸入檔案中,使用時注意移去其他無用的檔案。
qmake生成的Makefile檔案,可以根據需要做相應修改