Qt QMake

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

项目变量运算

  1. 变量及其运算符
    在项目中变量用来保存字符串列表: 其中变量又可以分为内置型变量 和自定义变量。
  • = 操作符
    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_DIRMOC文件输出目录
OBJECTS_DIROBJECTS文件输出目录
PRECOMPILED_HEADER预编译头文件
PWD使用该变量的文件(.pro 或 .pri)所在目录
QT_VERSIONQt的版本号
QT_MAJOR_VERSIONQt的主版本号
QT_MINOR_VERSIONQt的次版本号
QT_PATCH_VERSIONQt的补丁版本号
RC_FILE给应用程序指定资源名字,一般用于应用程序图标
RESOURCES指定目标(“资源收集”RC)文件的名称
SUBDIRS可以办项目中需要加入编译的子项目名称加入进来
TARGET指定目标文件的名称,缺省为xx.pro 项目名称,即xx
TRANSLATIONS指定翻译文件,(.ts) 文件

变量 选项配置

注释

  • #comment 用#来注释整行

  • 或是用快捷键 “Ctrl + /”用于注释一行以及多行

CONFIG

  1. 常用的配置选项
  • 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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值