一、模板变量 TEMPLATE
1.1模板变量介绍
模板变量作用告诉qmake为这个应用程序具体生成哪种makefile。下面是模板变量可供选择的值:
模板 | 说明 |
---|---|
app | 模板变量的默认值,建立一个应用程序的makefile。 |
aux | 创建一个不建任何东西的Makefile。如果没有编译器需要被调用来创建目标,比如你的项目使用解释型语言写的,使用此功能。注:此模板类型只能用于Makefile-based生成器。特别是,它不会工作在vcxproj和Xcode生成器。 |
lib | 建立一个库的makefile。 |
vcapp | 建立一个应用程序的Visual Studio项目文件。 |
vclib | 建立一个库的Visual Studio项目文件。 |
subdirs | 这是一个特殊的模板,它可以创建一个能够进入特定目录且为一个项目文件生成makefile,还能为它再调用make的makefile。 |
1.1.1 app模板
app模板告诉qmake为建立一个应用程序生成一个makefile。当使用这个模板时,设置下面这些qmake系统变量值是有效的。可以在.pro文件中使用它们为你的应用程序指定特定信息。
变量 | 说明 |
---|---|
DEFINES | 应用程序所需的额外的预处理程序定义的列表。 |
DEF_FILE | 只有Windows需要:应用程序所要连接的.def文件。 |
DEPENDPATH | 应用程序所依赖的搜索路径。 |
DESTDIR | 放置可执行程序目标的目录。 |
FORMS | 应用程序中的所有.ui文件(由Qt设计器生成)的列表。 |
HEADERS | 应用程序中的所有头文件的列表。 |
INCLUDEPATH | 应用程序所需的额外的包含路径的列表。 |
LEXSOURCES | 应用程序中的所有lex源文件的列表。 |
RC_FILE | 只有Windows需要:应用程序的资源文件。 |
RES_FILE | 只有Windows需要:应用程序所要连接的资源文件。 |
SOURCES | 应用程序中的所有源文件的列表。 |
TARGET | 可执行应用程序的名称。默认值为项目文件的名称。(如果需要扩展名,会被自动加上。) |
VPATH | 寻找补充文件的搜索路径。 |
YACCSOURCES | 应用程序中的所有yacc源文件的列表。 |
你只需要使用那些你已经有值的系统变量。例如,如果你不需要任何额外的INCLUDEPATH,那么你就不需要指定它,qmake会为所需的系统变量提供默认值。
例如:
#应用程序名称
TARGET = helloworld
#Makefile模板为应用程序
TEMPLATE = app
#应用程序中源文件列表
SOURCES += main.cpp\
hellodialog.cpp
#应用程序中头文件列表
HEADERS += hellodialog.h
#应用程序中ui文件列表
FORMS += hellodialog.ui
#应用程序中资源文件列表
RC_FILE += myico.rc
#测试功能宏开关
DEFINES += QT_NO_TEST_BTN
注意:如果条目是单值的,比如TARGET、TEMPLATE,我们是用“=”,但如果是多值条目,我们使用“+=”来为这个变量添加现有的条目值。
使用“=”会用新值替换原有的值。例如,如果我们写了DEFINES= QT_NO_TEST_BTN,其它DEFINES所有的条目值都将被删除并用QT_NO_TEST_BTN替代。
1.1.2 aux模板
创建一个不建任何东西的Makefile。如果没有编译器需要被调用来创建目标,比如你的项目使用解释型语言写的,使用此功能。注:此模板类型只能用于Makefile-based生成器。特别是,它不会工作在vcxproj和Xcode生成器。
1.1.3 lib模板
lib模板告诉qmake为建立一个库而生成一个makefile。当使用这个模板时,除了app模板中提到的系统变量外,还有一个VERSION是被支持的。
你需要在为库指定特定信息的.pro文件中使用它们。VERSION - 目标库的版本号。
1.1.4 vcapp模板
建立一个应用程序的Visual Studio项目文件。
1.1.5 vlib模板
建立一个库的Visual Studio项目文件。
1.1.6 subdirs模板
subdirs模板告诉qmake生成一个makefile,它可以进入到特定子目录并为这个目录中的项目文件生成makefile并且为它调用make。在这个模板中只有一个系统变量SUBDIRS可以被识别。这个变量中包含了所要处理的含有项目文件的子目录的列表。这个项目文件的名称是和子目录同名的,这样qmake就可以发现它。
二、配置变量CONFIG
2.1配置变量介绍
config为配置变量,指定了编译器所要使用的选项和所需要被连接的库。下面这些选项可以被构建工具qmake识别。
2.2控制编译器的选项
下面这些选项控制着使用哪些编译器标志:
选项 | 意义 |
---|---|
autogen_precompile_source | 自动生成一个.cpp文件,包含在.pro中指定的预编译头文件中。 |
build_all | 如果指定是debug_and_release模式,工程默认是同时用调试和发布模式编译。 |
c++11 | 启用c++11支持。 |
c++14 | 启用c++14支持。 |
debug | 应用程序将以debug模式连编(与release互斥)。 |
debug_and_release | 工程同时用调试和发布模式编译。 |
debug_and_release_target | 此选项默认设置。如果也指定了debug_and_release,最终的debug和release构建在不同的目录。 |
exceptions | 启用异常支持。默认设置。 |
exceptions_off | 禁用异常支持。 |
ordered | 使用subdirs模板时,本选项指定了子目录应该按照给出的顺序编译。 |
precompile_header | 可以在项目中使用预编译头文件的支持。 |
release | 应用程序将以release模式连编。如果“debug”被指定,它将被忽略。 |
rtti | 启用RTTI支持。 |
rtti_off | 禁用RTTI支持。 |
stl | 启用STL支持。 |
stl_off | 禁用STL支持。 |
warn_on | 编译器会输出尽可能多的警告信息。如果“warn_off”被指定,它将被忽略。 |
warn_off | 编译器会输出尽可能少的警告信息(与warn_on互斥)。 |
2.3 连编类型
下面这些选项定义了所要连编的库/应用程序的类型:
选项 | 说明 |
---|---|
console | 只用于app模板,应用程序是一个windows下的控制台应用程序。 |
dll | 只用于lib模板,库是一个共享库(dll)。 |
plugin | 只用于lib模板,库是一个插件,这将会使dll生效。 |
qt | 应用程序是一个Qt程序,并且Qt库将被链接。 |
staticlib | 只用于lib模板,库是一个静态库。 |
thread | 应用程序是一个多线程应用程序,当CONFIG包括qt时启用,这是缺省设置。 |
x11 | 应用程序是一个x11的应用程序或库。 |
windows | 只用于app模板,应用程序是一个windows下的窗口应用程序。 |
例如,如果你的应用程序使用Qt库,并且你想把它连编为一个可调试的多线程的应用程序,你的项目文件应该会有下面这行:
CONFIG += qt thread debug
注意:你必须使用“+=”,不要使用“=”,否则qmake就不能正确使用连编Qt的设置了。
2.4 声明Qt库模块
下面的罗列显示了QT变量可以使用的选项,并解释了相应的特点:
选项 | 说明 |
---|---|
core (included by default) | QtCore module 核心模块 |
gui (included by default) | QtGui module 界面模块 |
network | QtNetwork module 支持网络模块 |
opengl | QtOpenGL module 支持opengl图像编程 |
sql | QtSql module 支持sql数据库驱动 |
svg | QtSvg module 支持svg矢量图形 |
xml | QtXml module 支持xml模块 |
qt3support | Qt3Support module 支持qt3类 |
注意:添加opengl到QT变量里面,等价于往CONFIG变量里面添加。
所以对于Qt应用程序来说,没必要同时往QT变量和CONFIG变量里面添加opengl选项。
例如:
QT -= gui
使得该项目中不包含gui模块。
QT += core gui
在项目中添加core模块和gui模块。默认情况下,QT包含core和gui,以确保标准的GUI应用程序无需进一步的配置就可以构建。core模块中包含了非图形界面的核心功能,具体可以参考qt类图;gui模块扩展了core模块的图形界面功能。换句话说就是,如果项目涉及到图形界面的程序,则需要添加gui,如果不涉及图形界面程序则不需要添加gui。
PS:模块即很多相关类的集合
QT += sql xml
在项目中添加sql模块和xml模块。sql模块中包含了数据库相关的类;xml模块中包含了xml相关的类。
PS:一行中可以添加多个模块,只需空格隔开。
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
兼容Qt5需要添加该行代码。
2.5 关于 CONFIG(debug, debug|release)语法
CONFIG变量可以同时定义 debug 和 release,但只有一个处于active(当两个互斥的值都出现时,最后设置的处于active状态)
例如:
CONFIG(debug, debug|release){
#debug版本配置
MOC_DIR = $${BUILDDIR}/debug/moc
RCC_DIR = $${BUILDDIR}/debug/rcc
UI_DIR = $${BUILDDIR}/debug/ui
OBJECTS_DIR = $${BUILDDIR}/debug/obj
} else {
#release版本配置
MOC_DIR = $${BUILDDIR}/release/moc
RCC_DIR = $${BUILDDIR}/release/rcc
UI_DIR = $${BUILDDIR}/release/ui
OBJECTS_DIR = $${BUILDDIR}/release/obj
#测试功能宏开关
DEFINES += QT_NO_TEST_BTN
}
注意:可以通过在其它任何一个变量的变量名前加$$来把这个变量的值分配给当前的变量。
三、链接到库列表
LIBS
指定链接到项目中的库列表。如果使用Unix -l (library) 和 -L (library path) 标志,在Windows上qmake正确处理库(也就是说,将库的完整路径传递给链接器),库必须存在,qmake会寻找-l指定的库所在的目录。
例如:
unix:LIBS += -L"/opt/qt-4.7.1-SBC/lib" -lqwt
win32:LIBS += c:/mylibs/math.lib
注意:如果路径包含空格,需要使用引号包含路径。