天天看點

Qt pro 檔案詳解



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檔案,可以根據需要做相應修改