qmake详解
简述
Make工具有好几种,例如:
- GNU make 需要编写Makefile
- CMake 需要编写CMakeList
- BSD pmake
- makepp
- 微软MS nmake
- Qt qmake 需要编写.pro 文件
以上工具,大家或多或少会用到一两个, 本文主要详细介绍Qt 的qmake工具, 其有如下特点 - qmake只需编写少量信息就可以自动生成Makefiles, 简化 了在不同平台(Windows,linux, Mac)上开发项目的构建过程
- qmake 不仅仅局限于Qt, 可以用于其他软件项目,当然一般qmake大多都用在Qt软件开发
一个简单的.pro demo
首先需要创建项目需要的源文件: hello.h
,hello.cpp
, main
新建一个 hello.pro
文件, 添加如下内容,注意#号为注释符号,或者用快捷键“Ctrl + /”
#配置变量,采用debug模式构建项目,缺省是debug_and_release
CONFIG += debug
#输出目标名为 helloword.exe(win)/helloword(unix), 如果这一项不设置,则目标名#字与项目名一致,这里为#hello.exee(win)/hello(unix)
TARGET = helloword
#添加头文件
HEADER += hello.h
#添加源文件
SOURCES += hello.cpp \
+= main.cpp
#指定平台 windows, linux or mac等
win32{
#判断文件存不存在,不存在输出错误
!exists( mainwind.cpp ) {
error( "No mainwind.cpp file found" )
}
}
unix{
!exists( mainunix.cpp ) {
error( "No mainunix.cpp file found" )
}
}
win32:debug{
#配置变量,控制台应用程序,主要用于命令行编译时,查看qDebug()或std::cout或printf信#息
CONFIG += console
}
完成.pro 配置文件编写后,在命令行进行编译
qmake -o Makefile hello.pro
如果使用Visual Studio ,需要先将项目转换为hello.sln, VS 项目。
qmake -tp vc hello.pro
项目变量运算
- 变量及其运算符
在项目中变量用来保存字符串列表: 其中变量又可以分为内置型变量 和自定义变量。
- = 操作符
TARGET = myapp
#输出目标命名为 “myapp” - += 操作符 将新的值USE_MY_STUFF附加到 变量列表中
DEFINES += USE_MY_STUFF
#预定义,一般用于程序中的条件编译 - -= 操作符 将新的值USE_MY_STUFF从列表中移除
DEFINES -= USE_MY_STUFF
- *= 操作符 将新的值USE_MY_STUFF附加到 变量列表中, 但是USE_MY_STUFF没有定义过,即避免 重复添加
DEFINES *= USE_MY_STUFF
- ~= 操作符 用正则表达式替换指定的值
DEFINES ~= s/QT_[DT].+/QT
#任何以QT_D或QT_T开头的值都替换为QT - $$ 操作符用来提取变量的内容
SOURCES += main.cpp hello.h hello.cpp
EVERYTHING = $$SOURCES $$SOURCES
message("The project contains the following files:")
message($$EVERYTHING)
以上代码运行结构输出为:
The project contains the following files: main.cpp hello.h hello.cpp
DESTDIR = $$(PWD)
message(The project will be installed in $$DESTDIR)
其中PWD是指的.pro所在的目录
- {} 花括号语法
{} 类似于 条件声明,即编程语言里的if
<condition> {
<command or definition>
...
}
例如: 如果是windows平台,就在源文件列表里添加 paintwidget_win.cpp
文件
win32 {
SOURCES += paintwidget_win.cpp
}
例如: 如果不是windows平台,就在源文件列表里移除 paintwidget_win.cpp
文件
win32 {
SOURCES += paintwidget_win.cpp
}
花括号多重嵌套,可以用 :来连接
例如以下两个表达方式是一样的:
macx {
CONFIG(debug, debug|release) {
HEADERS += debugging.h
}
}
macx:CONFIG(debug, debug|release) {
HEADERS += debugging.h
}
逻辑判断 | 或 &:
win32|macx {
HEADERS += debugging.h
}
- 配置变量 和 花括号 一起使用
CONFIG += opengl
# opengl已经被加入到CONFIG变量中,所以应该执行第一个分支, 即输出目标的名字为 #application-gl
opengl {
TARGET = application-gl
} else {
TARGET = application
}
- {} 项目 运行平台, 运行系统, 编译器等等
message($$QMAKESPEC)
#linux g++编译器
linux-g++ {
message(Linux)
}
- 当然也可以自定义变量
DEFINES += USE_MY_STUFF
#MY_DEFINES是自定义变量,一般可以用来存储路径等等
MY_DEFINES = $$DEFINES
变量
常用的内置型变量
变量 | 内容 |
---|---|
CONFIG | 一般项目的配置选项 |
DEFINES | 预处理宏 |
DESTDIR | 指定可执行文件或是二进制文件生成位置 |
FORMS | 放置Ui文件,这些UI文件会被UI编译器处理 |
HEADERS | 头文件列表 |
SOURCES | 源文件列表 |
TEMPLATE | 项目模板,用于决定项目编译成为一个应用程序,库还是插件 |
INCLUDEPATH | 头文件包含目录 |
LIBS | 指定要连接到项目中的库 |
MOC_DIR | MOC文件输出目录 |
OBJECTS_DIR | OBJECTS文件输出目录 |
PRECOMPILED_HEADER | 预编译头文件 |
PWD | 使用该变量的文件(.pro 或 .pri)所在目录 |
QT_VERSION | Qt的版本号 |
QT_MAJOR_VERSION | Qt的主版本号 |
QT_MINOR_VERSION | Qt的次版本号 |
QT_PATCH_VERSION | Qt的补丁版本号 |
RC_FILE | 给应用程序指定资源名字,一般用于应用程序图标 |
RESOURCES | 指定目标(“资源收集”RC)文件的名称 |
SUBDIRS | 可以办项目中需要加入编译的子项目名称加入进来 |
TARGET | 指定目标文件的名称,缺省为xx.pro 项目名称,即xx |
TRANSLATIONS | 指定翻译文件,(.ts) 文件 |
变量 选项配置
注释
-
#comment
用#来注释整行 -
或是用快捷键 “Ctrl + /”用于注释一行以及多行
CONFIG
- 常用的配置选项
- CONFIG 选项列表1: 用于配置项目和编译选项
选项 | 详细 |
---|---|
release | 项目采用release模式构建,如果同时自定debug模式,,则最后指定的选项生效 |
debug | 项目采用debug模式构建 |
debug_and_release | 项目采用debug和release模式构建 |
debug_and_release_target | 默认采用这种模式构建,项目采用debug和release构建,并且构建结果放在debug 和 release 目录 |
build_all | 如果指定了debug_and_release选项,则项目默认采用debug和release模式构建 |
autogen_precompile_source | 自动生成 “a.cpp”文件,并且包含".pro"里指定的预编译头文件 |
order | 当使用 subdir 模板时,应该按照subdir选项指定的目录的顺序进行处理,一般是按照顺序编译多项目工程 |
precompile_header | 支持项目中使用预编译头文件 |
warn_on | 编译器应该尽可能多的输出警告,如果 warn_off 同时被指定,则最后指定的选项生效 |
warn_off | 编译器应该尽可能少的输出警告 |
exceptions | 支持使用异常机制,默认是设置的 |
exceptions_off | 不支持使用异常机制 |
rtti | 支持使用RTTI(Runtime Type Information)运行时确定对象的方法, 默认情况下,使用编译器默认值 |
rtti_off | 不支持使用RTTI, 默认情况下,使用编译器默认值 |
stl | 支持使用STL(Standard Template Library), 默认情况下,使用编译器默认值 |
stl_off | 不支持使用STL, 默认情况下,使用编译器默认值 |
thread | 支持使用线程,当配置包含qt时,是默认配置 |
c++11 | 支持使用C++11, 当编译器不支持C++11时,这个选项配置无效。默认是不支持C++11 |
c++14 | 支持使用C++14, 当编译器不支持C++14时,这个选项配置无效。默认是不支持C++14 |
depend_includepath | 支持将 INCLUDEPATH的值添加到DEPENDPATH, 缺省设置 |
- 构建模式一般采用debug_and_release的模式, 这种模式项目会被处理三次,分别生成 “meta” Makefile, Makefile.Debug,Makefile.Release
CONFIG += debug_and_release
build_pass和相应的debug或release添加到CONFIG选项,可以另其构建指定任务。如下代码用在动态库的生成时,如果是debug模式,生成的Target会多出d或debug, 即Targetd或Targetdebug
build_pass:CONFIG(debug, debug|release) {
unix: TARGET = $$join(TARGET,,,_debug)
else: TARGET = $$join(TARGET,,,d)
}
- CONFIG 选项列表2: 用于定义应用程序和库的类型:
选项 | 详细 |
---|---|
qt | 缺省选项, 设置目标项目是一个qt应用程序或者库 |
x11 | 设置目标项目是一个X11应用程序或者库 |
windows | 设置目标项目是一个Win32窗口应用程序 |
console | 设置目标项目是一个控制台应用程序 |
shared | 设置目标项目是一个共享对象或者DLL |
static | 设置目标项目是一个静态库 |
staticlib | |
plugin | 设置目标项目是一个插件 |
designer | 设置目标项目是一个Qt Designer 插件 |
DEFINES
qmake 添加这边变量的值作为 编译器C的预处理器宏
#在.pro文件里添加如下预定义宏
DEFINES += USE_MY_STUFF
在编写代码源文件里就可以这么使用:
#ifdef USE_MY_STUFF
QString hello = tr("hello world");
DESTDIR
指定目标的输出目录
#这是相对于输出默认输出目录,[如果是应用程序.exe(win32)]这个目录的上两级目录,创建lib目录(lib文件夹不存在则自动创建)
DESTDIR = ../../lib
FORMS
指定需要被UIC(UI编译器)编译的UI文件
FORMS = mydialog.ui \
mywidget.ui \
myconfig.ui
HEADERS
指定项目的头文件
HEADERS = myclass.h \
login.h \
mainwindow.h
SOURCES
指定项目的源文件
SOURCES = myclass.cpp \
login.cpp \
mainwindow.cpp
LIBS
指定项目外部依赖库
unix:LIBS += -L/usr/local/lib -lmath
win32:LIBS += c:/mylibs/math.lib
如果路径中包含了空格,需要用双引号指定引用路径
win32:LIBS += "C:/mylibs/extra libs/extra.lib"
unix:LIBS += "-L/home/user/extra libs" -lextra
MOC_DIR
指定moc文件的输出目录
unix:MOC_DIR = ../myproject/tmp
win32:MOC_DIR = c:/myproject/tmp
OBJECTS_DIR
指定object文件的输出目录
unix:OBJECTS_DIR = ../myproject/tmp
win32:OBJECTS_DIR = c:/myproject/tmp
PRECOMPILED_HEADER
预编译头文件, 用于指定用于生成预编译头文件的头文件。 一般用stdafx.h来用作预编译的头文件
PRECOMPILED_HEADER = $$PWD/stdafx.h
PWD
当前文件路径,如当前编辑的文件.pro的路径
QT
用于指定当前项目需要使用的Qt模块
QT -= gui # Only the core module is used.
SUBDIRS
一般用于多项目工程,指定项目所需要的各个模块
SUBDIRS = kernel \
tools \
myapp
如需要严格按照从上到下的顺便编译,则需要配置一下:
CONFIG += ordered
TARGET
指定项目输出目标的名称
TEMPLATE = app #这是一个应用程序
TARGET = myapp #输出myapp.exe(win32)或myapp(unix)
SOURCES = main.cpp #源文件
TEMPLATE
指定生成项目模板的名称
选项 | 详细 |
---|---|
app | 缺省选项, 创建一个Makefile用于构建应用程序 |
lib | 创建一个Makefile用于构建库 |
subdirs | 创建一个Makefile用于构建子项目 |
如下所示,用于构建库
TEMPLATE = lib
SOURCES = main.cpp
TARGET = mylib
TRANSLATIONS
Specifies a list of translation (.ts) files 指定翻译(.ts)文件列表, 用于国际化,配合Qt Linguist工具制作翻译文件。
TRANSLATIONS += ES_Output_Chinese.ts