Linux Qt5 二. QT中.pro文件的语法
[TOC]
在QT中,有一个工具qmake可以生成一个makefile文件,它是由.pro文件生成而来的。
注释
从#
开始,到这一行结束。
指定源文件
SOURCES = *.cpp
对于多源文件,可用空格分开,如:SOURCES = 1.cpp 2.cpp3.cpp
或者每一个文件可以被列在一个分开的行里面,通过反斜线另起一行,就像这样:
SOURCES = hello.cpp
main.cpp
一个更冗长的方法是单独地列出每一个文件,就像这样:
SOURCES+= hello.cpp
SOURCES +=main.cpp
这种方法中使用“+=”
比“=”
更安全,因为它只是向已有的列表中添加新的文件,而不是替换整个列表。
指定头文件
HEADERS = hello.h
或者HEADERS += hello.h
列出源文件的任何一个方法对头文件也都适用。
配置信息
CONFIG用来告诉qmake关于应用程序的配置信息。
CONFIG+= qt warn_on release
在这里使用“+=”,是因为我们添加我们的配置选项到任何一个已经存在中。这样做比使用“=”那样替换已经指定的所有选项是更安全的。
- qt: 告诉qmake这个应用程序是使用Qt来连编的。这也就是说qmake在连接和为编译添加所需的包含路径的时候会考虑到Qt库的。
- warn_on: 告诉qmake要把编译器设置为输出警告信息的。
- release: 告诉qmake应用程序必须被连编为一个发布的应用程序。在开发过程中,程序员也可以使用debug来替换release
指定目标文件名
TARGET = filename
如果不设置该项目,目标名会被自动设置为跟项目文件一样的名称
添加界面文件(ui)
INTERFACES = filename.ui
平台相关性处理
我们在这里需要做的是根据qmake所运行的平台来使用相应的作用域来进行处理。为Windows平台添加的依赖平台的文件的简单的作用域看起来就像这样:
win32 {
SOURCES += hello_win.cpp
}
所以如果qmake运行在Windows上的时候,它就会把hello_win.cpp添加到源文件列表中。如果qmake运行在其它平台上的时候,它会很简单地把这部分忽略。
如果一个文件不存在,停止qmake
如果某一个文件不存在的时候,你也许不想生成一个Makefile。我们可以通过使用exists()
函数来检查一个文件是否存在。我们可以通过使用error()
函数把正在运行的qmake停下来。这和作用域的工作方式一样。只要很简单地用这个函数来替换作用域条件。对main.cpp文件的检查就像这样:
!exists( main.cpp ) {
error( "No main.cpp file found")
}
!
用来否定这个测试,比如,如果文件存在,exists( main.cpp)
是真,如果文件不存在,!exists( main.cpp )
是真。
检查多于一个的条件
假设你使用Windows并且当你在命令行运行你的应用程序的时候你想能够看到qDebug()
语句。除非你在连编你的程序的时候使用console设置,你不会看到输出。我们可以很容易地把console添加到CONFIG行中,这样在Windows下,Makefile就会有这个设置。但是如果告诉你我们只是想在当我们的应用程序运行在Windows下并且当debug已经在CONFIG行中的时候,添加console。这需要两个嵌套的作用域;只要生成一个作用域,然后在它里面再生成另一个。把设置放在最里面的作用域里,就像这样:
win32 {
debug {
CONFIG += console
}
}
嵌套的作用域可以使用冒号连接起来,像这样:
win32:debug {
CONFIG += console
}
模板
模板变量告诉qmake为这个应用程序生成哪种makefile。下面是可供使用的选择:
- app -建立一个应用程序的makefile。这是默认值,所以如果模板没有被指定,这个将被使用。
- lib - 建立一个库的makefile。
- vcapp - 建立一个应用程序的VisualStudio项目文件。
- vclib - 建立一个库的VisualStudio项目文件。
- subdirs -这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文件生成makefile并且为它调用make的makefile。
生成Makefile
当你已经创建好你的项目文件,生成Makefile就很容易了,你所要做的就是先到你所生成的项目文件那里然后输入:
Makefile可以像这样由.pro
文件生成:
qmake -o Makefile 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 = QtDemo
添加或减少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时产生的信息
1. $${a} #读取变量a的字符串
2. $$(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
HEADS
我们工程中头文件如下:
HEADS += a.h \
b.h
SOURCES
我们工程中的cpp文件,如下:
SOURCES += a.cpp \
b.cpp \
main.cpp
上面的两个选项的文件分行是用反斜线\
来分行,最后一个不用,如果是同一行的文件可以空格分开,我们在执行qmake -project的时候,qmake已经自动帮我们写上了,省去我们这些麻烦,不过以后要增加文件可以在这里增加
INCLUDEPATH
这个选项可以指定我们#include
语句要包含头文件的目录,如果你有其它的不在当前目录的头文件需要包含进来,并又不想在自己的源文件中使用绝对路径或相对路径来包含头文件,那么我就可以在这里把这个头文件所在的路径包含进来
CONFIG
CONFIG经常用到的一个是就是设置release版本或是debug或是release和debug的版本信息。如果我们要调试可以这样设置。
CONFIG += debug
#CONFIG += 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 someunexpected 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
这个选项可以让我们定义我们生成的目标文件的名字,例如我们执行WS_Develop工程是默认生成WS_Develop的执行文件,但我们想让我们的执行的文件名为WS_Develop_T,我们就可以这样写
TARGET = WS_Develop_T
OBJECTS_DIR
一般我们在编译我们的工程的时候会生成许多的中间文件,如.o
(linux)下或
.obj(windows)`下,这样我们的工程就很乱,所以我们可以定义这个选择,我们可以这样定义:
OBJECTS_DIR += ./objs
这样,我们的这些中间文件就全都在WS_Develop/objs
目录下了
一般,我们不会在我们的工程里直接编译,这样的话,工程比较乱,我们可以在Project
目录下建立一个目录,为build
目录,我们在这个目录下编译,这样其他的临时文件就在这个目录下,这样我们的工程看起来就不会那么乱了。
我们进入build
目录,然后运行
qmake -o Makefile ../bakcup.pro
这样我们就在当前目录下生成了一个Makefile。在这个目录下执行make就可以生成我们的WS_Develop可执行程序了