我们编写Qt应用程序时,不管使用Qt Creator还是VS或者Eclipse,不管是Qt Widgets还是Qt Quick,总会发现有.pro文件,我们称.pro文件为Qt的工程管理文件,它存在的目的是列举工程中包含的源文件。类似于makefile,一个工程中可以包含一个或多个.pro文件。因此对于使用Qt的开发人员来说,熟悉.pro工程文件的语法,懂得阅读和修改.pro文件,将有利于对项目工程的文件组织和管理。
  qmake、.pro文件、makefile文件的关系简单来说就是:

qmake工具使用了与平台无关的.pro文件生成与平台相关的makefile文件。

  所以虽然本文标题为.pro文件语法学习,实际上应该是qmake的语法学习,但是因为IDE把qmake隐藏起来了,我们接触地更多的是.pro文件,因此还是使用这样的标题。

================================

TARGET变量 & TEMPLATE变量 & CONFIG变量:

  首先我们需要知道工程文件主要分为三种:app(单独的应用程序)、lib(静态或动态库)和subdirs(递归编译)。工程文件的类型可以使用TEMPLATE变量来指定。

  TARGET是用来定义应用程序的名字的,而程序的扩展名则由TEMPLATE来定义。例如:TARGET = hello,TEMPLATE = app,则在Linux下会生成hello(无后缀的ELF可执行文件),对应的在Windows下会生成hello.exe。

  TEMPLATE和CONFIG共同定义了目标类型,以下是几种常见情况:

  • TEMPLATE = app,生成标准程序(注意如果没有TEMPLATE这一项,那么默认工程就是app)。
  • TEMPLATE = subdirs,子项目工程模板,可以用它来创建一个能够进入特定目录并且编译子目录里的目标文件。此时除了TEMPLATE = subdirs,还需要指定SUBDIRS变量,在每个子目录中,qmake会搜寻以目录命名的.pro文件,并且会编译该工程。
  • TEMPLATE = lib,生成库文件,若不指定CONFIG变量,则编译为共享库;若CONFIG += staticlib,则编译为静态库;若CONFIG += plugin,则编译为插件(插件总是动态库)。

对于app或者lib工程,以下是较常使用的一些变量:

  • TARGET变量:指定可执行文件或库的基本文件名,其中不包含任何的扩展、前缀或版本号。(默认的是当前的目录名)
  • CONFIG变量:指定各种用于工程配置和编译的参数
  • HEADERS变量:指定工程的C++头文件(.h)
  • SOURCES变量:指定工程的C++实现文件(.cpp)
  • FORMS变量:指定需要uic处理的由Qt设计师生成的.ui文件
  • RESOURCES变量:指定需要rcc处理的.qrc文件(资源文件)
  • LEXSOURCES变量:指定工程的lex源文件(.l)
  • YACCSOURCES变量:指定工程中的yacc源文件(.y)
  • DEFINES变量:指定预定义的C++预处理器符号
  • INCLUDEPATH变量:指定C++编译器搜索全局头文件的路径
  • LIBS变量:指定工程要链接的库。库既可以通过绝对路径指定,也可以使用源自Unix的-L和-l标识符来指定(例如:-L/usr/local/lib和-ldb_cxx)
  • QT变量:指定工程所要使用的Qt模块(默认的是core gui,对应于QtCore和QtGui模块)
  • VERSION变量:指定目标库的版本号
  • DESTDIR变量:指定生成的可执行文件放置的目录。(默认值是平台相关的,例如在Linux上,值当前目录;在Windows上,则是指debug或release子目录)
  • DLLDESTDIR变量:指定目标库文件放置的目录(默认与DESTDIR相同)
  • OBJECTS_DIR变量:指定目标文件(.o文件)的存放目录

.pro文件中的注释:
  注释以井号(#)开头,在行尾处结束。

.pro文件中的一个条目的语法通常具有如下形式:

variable = values

  values是字符串的列表,例如:CONFIG = qt release warn_off,是指将列表 [“qt”, “release”, “warn_off”] 赋给CONFIG变量,注意!它会覆盖CONFIG变量以前设置的各个值。因此我们通常用 += 操作符来扩展变量的值。如:

CONFIG = qt
CONFIG += release
CONFIG += warn_off

  同样,我们也可以用 -= 操作符从当前的变量中移除任意的指定值。如:

CONFIG = qt release warn_off
CONFIG -= qt

会使CONFIG变量的值变成 [“release”, “warn_off”]。
  另外还有 = 操作符和 ~= 操作符。= 操作符在一个变量上添加一个值,但要求被添加的值不在变量的列表上,否则将不做任何事情。例如:

SOURCE *= main.cpp

这一行将把main.cpp文件添加到工程中,只有当它还没有被添加的情况下才会添加。
最后,~= 操作符使用指定的值替换符合正则表达式的值,这是sed的语法。例如:

SOURCES ~= s/\.cpp\b/.cxx/

使用.cxx替换SOURCES变量中所有.cpp文件的扩展名。

  除了使用qmake定义的标准变量外,我们也可以设置任意变量和值,并且可以使用$$varName 或者 $${varName} 语法引用它。例如:

MY_VERSION = 2.0
TARGET = Hello_$${MY_VERSION}

  使用 $${PWD} 可以获取当前文件所在的目录路径。
  使用内置函数 $$lower() 可以把字符串转换为小写。
  而内置函数$$system() 允许我们从外部应用程序中产生字符串,例如想要确认当前的UNIX版本,可以这样写:

OS_VERSION = $$system(uname -r)

然后,可以在条件中使用结果变量,并与contains()合用:

contains(OS_VERSION, SunOS): SOURCES += mythread_sun.c

  有时候可能需要在.pro文件中指定包含空格的文件名。在这种情况下,只需要简单地把文件名用引号括起来即可。
  当在不同平台上编译工程时,可能有必要基于平台指定不同的文件或者不同的参数。qmake的条件判断语法是:

condition {then-case
} else {else-case
}

condition部分可以是平台名字(例如:win32、unix或者macx),或者更复杂的断言。then-case和else-case部分使用标准语法为变量赋值。例如:

win32 {SOURCES += serial_win.cpp
} else {SOURCES += serial_unix.cpp
}

else分支是可选的。为了方便,当then-case部分仅有一条变量赋值,而且在没有else-case分支时,qmake也支持单行形式的语法。例如:

macx: SOURCES += serial_mac.cpp

  如果有几个工程文件需要共享相同的项,则可以把相同的项提取到单独的文件中,在各自的.pro文件中使用include()语句包含它们。例如:

include(../common.pri)

通常,打算被别的工程文件所包含的工程文件会带有.pri(工程包含)的扩展名。

================================

  我们这里提到的一些qmake常用语法,但相对于强大的qmake工具本身提供参数和特性,本文也只是冰山一角,因此如果想对qmake作更多了解,可以参考qmake指南的在线帮助文档。

Qt的.pro工程文件语法学习相关推荐

  1. ninja文件语法学习

    ninja文件语法学习 ninja本质上是配置文件,没有分支,循环的流程控制. 语法 基本概念 edge(边):build语句,可以指定目标(target)输出(output).规则(rule)与输入 ...

  2. 【Qt】 Pro工程管理文件介绍

    一般在新建一个工程后,在目录中都有一个*.pro的文件,这个文件名称与项目名称相同,我们称之为工程管理文件.该文件主要实现工程的相关配置,例如工程中包含的组件,文件,链接库等.qmake使用.pro文 ...

  3. Qt pro工程文件中判断宏定义是否存在

    在Qt工程文件中如果自定义了宏,那么在如果要判断该宏是否存在,可以这么写 xx.pro 添加宏定义: DEFINES += ANDROID_TV 判断宏定义是否存在 contains(DEFINES, ...

  4. QT.pro工程文件中判断宏定义是否存在

    在QT .pro文件中添加自定义了宏: DEFINES += ANDROID_TV 那么如果要判断该宏是否存在,可以这么写 xx.pro contains(DEFINES,ANDROID_TV) { ...

  5. QT PRO工程文件区分Debug和Release方法

    pro文件内设置根据debug/release以及32/64位分别输出到不同目录: pro文件中 添加如下代码: CONFIG += debug_and_release CONFIG(debug, d ...

  6. Cadence物理库 LEF 文件语法学习【持续更新】

    我是 雪天鱼,一名FPGA爱好者,研究方向是FPGA架构探索. 关注公众号,拉你进"IC设计交流群". 文章目录 一.LEF简介 1.1 通用规则 1.2 管理 LEF 文件 二. ...

  7. 修改QtCreator的默认pro工程文件,添加assert.h条件切换

    CONFIG(release, debug|release) {DEFINES += NDEBUG}

  8. QT模块化编程 pri子工程创建以及使用 pro工程

    前言 Qt中的Pri文件在一般小型项目中其实很少能使用到的,不过,当你的项目需要多人参与直至团队协作时,Pri文件的作用就很大了,这里我们来看看Pri在大型项目中的使用,中小型项目使用实际上也是很有益 ...

  9. 利用qt实现解压缩zip文件

    作者开发环境:Qt5.8 ,win10 总体思路:首先我们编译zip源码,生成zip的动态库:然后再编译quazip源码,得到quazip的动态库:最后在我们的程序中去调用. 详细步骤: 1.编译zl ...

最新文章

  1. Kmeans聚类算法详解
  2. python编程入门与案例详解pdf-Python入门之三角函数sin()函数实例详解
  3. 推公式hdu2298
  4. java中static、final 和 static final之间的区别
  5. 漫画:程序员之间的真爱,好暖啊!
  6. layer弹出层扩展自定义样式
  7. Android访问瓦片地图 费流量,瓦片地图服务在线资源访问总结
  8. Spring学习之旅(二):Bean的高级装配之解决装配歧义性
  9. php动态网页技术难点及分析,动态网页技术PHP关于cookie和session的分析
  10. poj 3295 Tautology (构造)
  11. 为什么计算机网络使用数字信号,什么是数字信号
  12. Python实现5毛钱特效
  13. 【Android Studio】如果你不管怎么折腾都提示Minimum supported Gradle version is 7.0.2. Current version is 6.8,请看这里
  14. 简单典型二阶系统_【文献选译】二阶弹性波动方程PML的简单实现
  15. excel 电阻并联计算_3个并联电阻计算公式 并联电阻计算公式计算方法
  16. matlab 2018b 下载 (for Windows/Linux/Mac)
  17. 对勾和叉怎么打_word中插入打勾符号和打叉符号方法
  18. 利用matlab的SPM12功能核磁共振成像数据处理_Auditory fMRI data(二)
  19. exp 利用系统日期做文件
  20. SaaS开发的敏捷之道 —— 专访用友伟库网开发经理

热门文章

  1. 高度近视也不用带眼镜了 (经典珍藏版)
  2. Squeeze-and-Excitation Networks(SENet) 学习笔记
  3. #高级语言 各种开发软件介绍
  4. Phoenix创建盐表
  5. C# 获取USB设备列表
  6. phpstorm快速编辑模板技巧
  7. 创造与魔法服务器在哪里显示,创造与魔法监狱在哪里 创造与魔法监狱坐标
  8. 网站制作笔记-bootstrap可视化布局,表单生成工具,快速制作网页原型
  9. tif转成bmp matlab,【转 】将图像转化成avi格式电影(bmp2avi,jpg2avi,tiff2avi等) - [Matlab]...
  10. python标准库math中sin函数的参数单位是角度吗_弧度 - math.h中的三角函数,参数是弧度,不是角度...