QT配置文件入门
QT配置文件入门
学习QT才两个月,没什么经验,一点点小心得。希望大家多指点。// --------------------------------------------------------------------------------
用了一段时间的Qt了,对其.pro的配置文件比较感兴趣,就像以前花了大把时间弄Ant一样。以下内容主要是对qmake配置文件做一点简要的说明,外加一点体会吧。
先给出一个我当前项目的配置文件,再一一解释:
myproject.pro
TEMPLATE = app
QT += core gui sql
CONFIG += debug MODULE_GUARD_DOG
DEFINES += MODULE_GUARD_DOG
TARGET = wms
DESTDIR = ./bin
DLLDESTDIR = ./bin
DEPENDPATH += .
INCLUDEPATH += ./tmp ./include ./modules/usbphone
INCLUDEPATH *= .
LIBS += -Llib -lGxUsb
MOC_DIR = ./tmp
OBJECTS_DIR = ./tmp
UI_HEADERS_DIR = ./tmp
RCC_DIR = ./tmp
include(wms.pri)
include(modules/usbphone/usbphone.pri)
win32:RC_FILE = wms.rc
MODULE_GUARD_DOG{
HEADERS += GuardDog.h
SOURCES += GuardDog.cpp
}
C++的工程往往有两大类,一是应用程序,另一个则是动态(静态)库。TEMPLATE参数差不多就是标识这个工程的类型了。它有app、lib、subdirs三种类型。前两种类型与两类工程相关,subdirs则是用于配置子项目的。当一个工程比较复杂时,可能会将其分为多个项目,项目之间又相关关联,此时可以写一个统领全局编译配置的文档,其模板类型就是subdirs,意思是说,当前的这个文件呢,只负责协调子项目之间的编译,不包含具体的编译事宜。子项目下面也会有.pro文件,并且要负责其项目中的源文件编译。subdirs类型在Qt的源码中用的比较广泛,毕竟是大工程。呵呵。
QT参数表示当前项目中使用到了哪些QT的模块。core表示核心模块,这是整个QT框架的基础,所有的QT项目都会默认包含这个模块。 gui是图形用户界面模块,这个也是默认包含的项目中的,毕竟GUI是QT的强项吧。sql是数据库模块。当前的项目中只使用到了这三个模块,另外,QT 还有netword、opengl(3D图形库)、phonon(多媒体库)、svg、xml、webkit(浏览器引擎)等模块。
CONFIG参数用于指定当前项目配置及项目被编译时的一些选项——如项目是以debug还是release模式的编译。其常规值有 debug、release、debug_and_release、build_all、ordered、warn_on、warn_off。 CONFIG可以是一个或者多个这样的值,也就是说用户可以设置:
CONFIG += debug release #注意,不同的值是用空格隔开的
同时给它赋予debug和release值可不是相像是的那样让项目同时在两种模式下编译哦,debug参数会覆盖release值的,也就是说,在这样的配置下,项目还是只会在debug模式下编译,除非使用了debug_and_release值。另外,build_all与 debug_and_release差不多是一样的,warn_on、warn_off是开启或者关闭编译警告。剩下要说的是ordered,它的意思是按顺序编译。这个值要与TEMPLATE中的subdirs值配合使用,意思按.pro文件中的目录顺序编译。
说完了CONFIG的常规值,再来说说不常规的值——常规以外的,都是不常规的啦。用户其实可以给CONFIG赋予任意合法字符窜的。如上面配置文件中就有一个MODULE_GUARD_DOG(加密狗模块),当然,这个模块并非QT所有,而是我自己项目中的模块。MODULE_GUARD_DOG 除了出现在CONFIG中以外,还在DEFINEDS和文件最后面出现过。CONFIG中的MODULE_GUARD_DOG与DEFINEDS中的 MODULE_GUARD_DOG其实没有什么关联,若要说有,那也只是它们刚好服务于同一个模块而言。但是CONFIG中的 MODULE_GUARD_DOG却让qmake执行了文件最后面大括号中的内容。
在qmake配置文件有条件判断语句,类似于
if(xxx){}
之类了。不过,不需要if。那么 MODULE_GUARD_DOG{} 语句的意思就是当文件中定义了MODULE_GUARD_DOG的时候,就执行括号中的内容(把头文件和源文件编入到编译范围中)。类似的判断还有很多,qmake提供一些判断函数,如isEmpty()、contains()等,详细的请参数qmake操作手册。
DEFINES参数:其作用嘛,就是
#ifndef XXX
#define XXX
#endif
明白了吧,它也就是一个define,我们也经常在命令行中使用的-DXXX一样。
TARGET参数:项目生成的exe文件,或者.dll、.lib、.a等文件的文件名。默认是项目工程目录的名字。DESTDIR、DLLDESTDIR则是exe,lib,dll这些文件所有的目录了。
INCLUDEPATH参数:项目所需要头文件的路径
LIBS参数:项目所使用到的静态文件的路径。其中-L表示静态文件的路径、-l表示静态文件的名字(不包含扩展名)。也可以不用-L -l,直接写完整路径,如LIBS += C:\A.LIB(注意,现在可是需要扩展名的啦)
MOC_DIR、OBJECTS_DIR、UI_HEADERS_DIR、RCC_DIR指的是编译过程中产生的名种重要临时文件的目录。 MOC_DIR是元对象编译的中间结果,由moc命令产生,OBJECTS_DIR是编译器产生,.obj文件,经过链接之后就生成那个exe啦。 UI_HEADERS_DIR图形文件对应的头文件,由uic产生。RCC_DIR是资料文件被编译后产生的结果。这些文件都是临时,生成的exe文件并不需要使用到它们,因此把它们放在临时目录即可。一般IDE工具会把它们默认放在debug目录中,但有时候也会与自己的源文件混在一起。所以最好还是给它们指定一个目录。
include表示包含一个pri的配置文件。pri配置文件与pro文件格式几乎相同,就像ant的配置文件有时也会引入其它的配置文件一样。主要是用于把公共的,或者需要独立的配置部分抽出来。因为一个项目里面可能存在多个pro文件,而这几个pro文件又可以同时使用到一些相同的内容。另外,pri文件在一定程序上也可以用于划分包逻辑结构。c++没有像java那样的包层次结构,但用这种方式在一定程度上达到相似的效果。
RC_FILE参数:指定的是项目资源文件。这个文件会被编译到exe文件中,它里面可以包含图片、文档等。一般用于不想被用户修改的只读数据了。如项目中使用的一些图片、系统初始化用于配置之类。让人疑惑的是,前面为什么有一个win23:呢?与前面提到的MODULE_GUARD_DOG{} 一样,这是一种缩写形式。如果当前的平台是win32的,就执行冒号后面的语句(只能有一条,如果多条的话,就要用括号了)。平台参数与当前的开发环境相关,还有unix、mac、wince等参数