在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
文件。
第一種常用方式:
模塊設置,一般設置為app
(生成應用程序,默認),subdirs
(生成makefile文件編譯subdirs指定的子文件夾),lib
(生成庫文件)
TEMPLATE = app
指定生成的應用程序放置的目錄
DESTDIR += ../bin
指定生成的應用程序名
TARGET = pksystem
添加或減少CONFIG的配置模塊,一般采用默認即可,但是除去debug_and_release
模塊不會生成debug和release文件夾
CONFIG += release
CONFIG -= debug_and_release
指定uic命令將.ui文件轉化成ui_*.h
文件的存放的目錄
UI_DIR += forms
指定rcc命令將.qrc文件轉換成qrc_*.h
文件的存放目錄
RCC_DIR += ../tmp
指定moc命令將含Q_OBJECT
的頭文件轉換成標准.h
文件的存放目錄
MOC_DIR += ../tmp
指定目標文件的存放目錄
OBJECTS_DIR += ../tmp
程序編譯時依賴的相關路徑
DEPENDPATH += . forms include qrc sources
頭文件包含路徑
INCLUDEPATH += .
qmake時產生的信息,$${a}讀取變量a的字符串
,$$(PATH)讀取環境變量PATH
message($$(PATH))
源文件編碼方式
CODECFORSRC = GBK
Input
工程中包含的頭文件
HEADERS += include/painter.h
工程中包含的.ui設計文件
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