在QT中,有一個工具qmake可以生成一個makefile文件,它是由.pro文件生成而來的,.pro文件的寫法如下:
1. 注釋
從“#”開始,到這一行結束。
2. 指定源文件
SOURCES = *.cpp
對於多源文件,可用空格分開,如:SOURCES = 1.cpp 2.cpp3.cpp
或者每一個文件可以被列在一個分開的行里面,通過反斜線另起一行,就像這樣:
SOURCES = hello.cpp
main.cpp
一個更冗長的方法是單獨地列出每一個文件,就像這樣:
SOURCES+= hello.cpp
SOURCES +=main.cpp
這種方法中使用“+=”比“=”更安全,因為它只是向已有的列表中添加新的文件,而不是替換整個列表。
3. 指定頭文件
HEADERS = hello.h或者HEADERS += hello.h
列出源文件的任何一個方法對頭文件也都適用。
4. 配置信息
CONFIG用來告訴qmake關於應用程序的配置信息。
CONFIG+= qt warn_on release
在這里使用“+=”,是因為我們添加我們的配置選項到任何一個已經存在中。這樣做比使用“=”那樣替換已經指定的所有選項是更安全的。
A> qt部分告訴qmake這個應用程序是使用Qt來連編的。這也就是說qmake在連接和為編譯添加所需的包含路徑的時候會考慮到Qt庫的。
B> warn_on部分告訴qmake要把編譯器設置為輸出警告信息的。
C> release部分告訴qmake應用程序必須被連編為一個發布的應用程序。在開發過程中,程序員也可以使用debug來替換release
5. 指定目標文件名
TARGET = filename
如果不設置該項目,目標名會被自動設置為跟項目文件一樣的名稱
6. 添加界面文件(ui)
INTERFACES = filename.ui
7. 平台相關性處理
我們在這里需要做的是根據qmake所運行的平台來使用相應的作用域來進行處理。為Windows平台添加的依賴平台的文件的簡單的作用域看起來就像這樣:
win32 {
SOURCES += hello_win.cpp
}
所以如果qmake運行在Windows上的時候,它就會把hello_win.cpp添加到源文件列表中。如果qmake運行在其它平台上的時候,它會很簡單地把這部分忽略。
8. 如果一個文件不存在,停止qmake
如果某一個文件不存在的時候,你也許不想生成一個Makefile。我們可以通過使用exists()函數來檢查一個文件是否存在。我們可以通過使用error()函數把正在運行的qmake停下來。這和作用域的工作方式一樣。只要很簡單地用這個函數來替換作用域條件。對main.cpp文件的檢查就像這樣:
!exists( main.cpp ) {
error( "No main.cpp file found")
}
“!”用來否定這個測試,比如,如果文件存在,exists( main.cpp)是真,如果文件不存在,!exists( main.cpp )是真。
9. 檢查多於一個的條件
假設你使用Windows並且當你在命令行運行你的應用程序的時候你想能夠看到qDebug()語句。除非你在連編你的程序的時候使用console設置,你不會看到輸出。我們可以很容易地把console添加到CONFIG行中,這樣在Windows下,Makefile就會有這個設置。但是如果告訴你我們只是想在當我們的應用程序運行在Windows下並且當debug已經在CONFIG行中的時候,添加console。這需要兩個嵌套的作用域;只要生成一個作用域,然后在它里面再生成另一個。把設置放在最里面的作用域里,就像這樣:
win32 {
debug {
CONFIG += console
}
}
嵌套的作用域可以使用冒號連接起來,像這樣:
win32:debug {
CONFIG += console
}
10. 摸板
模板變量告訴qmake為這個應用程序生成哪種makefile。下面是可供使用的選擇:
A> app -建立一個應用程序的makefile。這是默認值,所以如果模板沒有被指定,這個將被使用。
B> lib - 建立一個庫的makefile。
C> vcapp - 建立一個應用程序的VisualStudio項目文件。
D> vclib - 建立一個庫的VisualStudio項目文件。
E> subdirs -這是一個特殊的模板,它可以創建一個能夠進入特定目錄並且為一個項目文件生成makefile並且為它調用make的makefile。
11. 生成Makefile
當你已經創建好你的項目文件,生成Makefile就很容易了,你所要做的就是先到你所生成的項目文件那里然后輸入:
Makefile可以像這樣由“.pro”文件生成:
qmake -oMakefile hello.pro
對於VisualStudio的用戶,qmake也可以生成“.dsp”文件,例如:
qmake -tvcapp -o hello.dsp hello.pro
我們在編譯QT的工程的時候,一般都會讓qmake自動生成,但有時我們需要定制我們的工程,那么就必須改寫pro文件。
要自己全部寫pro文件又有點麻煩,所以,一般都是先運行
qmake -project
來生成基本的pro文件。
例如你有一個工程目錄為backup,那么在這個目錄下就會生成backup.pro文件。
對一般的工程,我們只需要修改幾個基本的常用的選項,下面說說怎么修改。
假設我們有個目錄,名字為backup。下面有a.h,a.cpp,b.h,b.cpp,main.cpp等文件。
首先我們可以在backup目錄下運行qmake -project生成backup.pro文件。
888888888888888888888888888888888888888888888888888888888888888888
TEMPLATE = app
DESTDIR += ../bin
TARGET = pksystem
#CONFIG += release
CONFIG -= debug_and_release
UI_DIR += forms
RCC_DIR += ../tmp
MOC_DIR += ../tmp
OBJECTS_DIR += ../tmp
DEPENDPATH += . forms include qrc sources
INCLUDEPATH += .
#message($$(PATH))
CODECFORSRC = GBK
#工程中包含的頭文件
HEADERS += include/painter.h
FORMS += forms/painter.ui
SOURCES += sources/main.cpp sources/painter.cpp
RESOURCES += qrc/painter.qrc
TEMPLATE = subdirs
#子文件夾目錄,可用\換行
SUBDIRS = src1 \
src2
在backup.pro里已經包含了幾個基本的選項,如
TEMPLATE,TARGET,INCLUDEPATH,HEADS,SOURCES等選項。
下面說明一下幾個經常修改的選項。
HEADS:
我們工程中頭文件如下:
HEADS += a.h \
b.h
SOURCES:
我們工程中的cpp文件,如下:
SOURCES += a.cpp \
b.cpp \
main.cpp
上面的兩個選項的文件分行是用反斜線\來分行,最后一個不用,如果是同一行的文件可以空格分開,我們在執行qmake -project的時候,qmake已經自動幫我們寫上了,省去我們這些麻煩,不過以后要增加文件可以在這里增加。
INCLUDEPATH:
這個選項可以指定我們#include語句要包含頭文件的目錄,如果你有其它的不在當前目錄的頭文件需要包含進來,並又不想在自己的源文件中使用絕對路徑或相對路徑來包含頭文件,那么我就可以在這里把這個頭文件所在的路徑包含進來,例如在backup目錄的兄弟目錄里有個目錄為image的目錄,里面有個頭文件為image.h,我們的b.h里要用到,因此我們在backup.pro文件中設置INCLUDEPATH為
INCLUDEPATH += ../image
這樣,我們在b.h里只需要#include "image.h"就可以了。
CONFIG:
CONFIG經常用到的一個是就是設置release版本或是debug或是release和debug的版本信息。如果我們要調試可以這樣設置。
CONFIG += debug
或CONFIG += release (release版本)
下面是CONFIG的幾個版本的選項:
release The project is to be built in release mode. This is ignored if debug is also specified.
debug The project is to be built in debug mode.
debug_and_release The project is built in both debug and release modes. This can have some unexpected side effects (see below for more information).
build_all If debug_and_release is specified, the project is built in both debug and release modes by default.
ordered When using the subdirs template, this option specifies that the directories listed should be processed in the order in which they are given.
precompile_header Enables support for the use of precompiled headers in projects.
warn_on The compiler should output as many warnings as possible. This is ignored if warn_off is specified.
warn_off The compiler should output as few warnings as possible.
LIBS:
這里可以選擇我們要包含的庫,例如我們的工程要用到libz.so的一個壓縮庫,我可以怎么寫:
LIBS += -lz
或是用到我們image目錄下的libimage.so庫,那么可以這么寫:
LIBS += -L../image/image
DEFINES:
DEFINES又是我們一個常用的定要,它相當於我們用gcc的-D定義。例如,我們的backup工程需要對大文件進行讀寫就可以這樣定義:
DEFINES += _LARGEFILE64_SOURCE _FILE_OFFSET_BITS=64
RESOURCES:
定義我們的資源描述文件,我們工程里需要很多圖片,那么這些圖片的定義都可以放在backup.qrc文件中進行描述,那么這里就可以指出我們的qrc文件。
RESOURCES += backup.qrc
TARGET:
這個選項可以讓我們定義我們生成的目標文件的名字,例如我們執行我們這個backup工程是默認生成backup的執行文件,但我們想讓我們的執行的文件名為abcbackup,我們就可以這樣寫
TARGET = abcbackup
OBJECTS_DIR:
一般我們在編譯我們的工程的時候會生成許多的中間文件,如.o文件(linux下)或.obj(windows下),這樣我們的工程就很亂,所以我們可以定義這個選擇,我們可以這樣定義:
OBJECTS_DIR += ./objs
這樣,我們的這些中間文件就全都在backup/objs目錄下了
一般,我們不會在我們的工程里直接編譯,這樣的話,工程比較亂,我們可以在backup目錄下建立一個目錄,為bakcup-build目錄,我們在這個目錄下編譯,這樣其他的臨時文件就在這個目錄下,這樣我們的工程看起來就不會那么亂了。
我們進入bakcup-build目錄,然后運行
qmake -o Makefile ../bakcup.pro
這樣我們就在當前目錄下生成了一個Makefile。在這個目錄下執行make就可以生成我們的abcbackup可執行程序了
轉自: http://blog.csdn.net/metasearch/article/details/2148207
