找回密码
 立即注册
收起左侧

【独家连载】Qt入门与提高:KS02-05 pri 文件有啥用?

4
回复
6404
查看
[复制链接]
累计签到:41 天
连续签到:1 天
来源: 原创 2018-10-6 11:40:02 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 baizy77 于 2019-7-2 20:25 编辑

版权声明
---------------------------------------------------------------------------------------------------------------------
该文章原创于Qter开源社区(www.qter.org
作者: 女儿叫老白
转载请注明出处!
---------------------------------------------------------------------------------------------------------------------
网页版课程源码 提取码:1uy7
引言
----------------------------------------------------------------------------------------------------------------------
在前面的章节中我们介绍了pro文件的常用配置。当我们进行项目研发时,在各个子项目的pro中经常会出现重复配置,为了处理这种问题,Qt提供了另外一个项目配置文件:pri文件。在pri文件里,我们可以编写公共的变量给各个子项目用,还可以配置各种编译选项、配置各种路径。在本节中,我们将讨论一下pri文件都有哪些作用。
正文
----------------------------------------------------------------------------------------------------------------------
在本节中,我们将以常用关键字为线索,介绍pri文件所能起到的各种功能。我们准备为大家介绍如下关键字:
1,  include --- 在pro中引入其他的pri文件
2,  环境变量 --- 在pri中使用环境变量
2,  变量--- 在pri中定义与使用变量
3, 函数  --- pri中提供的常用函数
4, unix/win32  --- 配置不同平台下的编译配置项
5, DEFINES --- 在pri中定义宏
6, CONFIG的参数项
7, QMAKE_CXXFLAGS  --- 配置编译警告
现在,我们来分别进行介绍:

1,  include --- 在pro中引入其他的pri文件
       pri文件编写完成之后,可以在项目文件(pro文件)或者其他pri文件中引用。语法如下:
              include  (pri文件全路径名)   
比如:
include  ($(TRAINDEVHOME)/src/compile.pri)
注:
  1)  请注意include后面有空格。
  2)  pri文件路径中的目录分隔符要用"/",请不要使用"\"。
   3)  pri文件只能被另一个pri文件或pro文件引用,不能在.h或.cpp文件中用#include语句进行引用。

2,  环境变量 --- 在pri中使用环境变量
       有时候,在项目编译时我们会用到一些环境变量,比如,将项目编译为32位还是64位,编译成debug版还是release版等等。那么,在pri文件中,我们怎样使用这些环境变量呢?
       语法:  $$(环境变量名称)
       比如:
代码清单:
----------------------------------------------------------------------------------------------------------------------
              Include  ($$(TRAINDEVHOME)/src/gui_base.pri)
OBJECTS_DIR = $$ (TRAINDEVHOME)/obj/chapter02/ks02_04
----------------------------------------------------------------------------------------------------------------------

       在上述例子中,我们用到了TRAINDEVHOME这个环境变量值,分别用来描述gui_base.pri的文件路径以及ks02_04项目的OBJECT_DIR值。

3  变量与环境变量 --- 在pri中定义与使用变量、环境变量
       除了环境变量,我们有时候为了方便还会自己定义一些变量。
       比如,Qt的isEmpty()函数不识别环境变量,因此我们可以这样做:

代码清单:
----------------------------------------------------------------------------------------------------------------------
DEVHOME = $$(TRAINDEVHOME)
isEmpty(DEVHOME) {
       error('TRAINDEVHOME'环境变量必须被定义.)
}
----------------------------------------------------------------------------------------------------------------------
       在上述代码中,因为isEmpty()函数不识别环境变量但是可以识别我们定义的变量,所以我们定义了DEVHOME变量,这样isEmpty()就可以根据TRAINDEVHOME这个环境变量的取值进行判断,如果未定义TRAINDEVHOME环境变量,那么就会报错。
       使用语法同系统环境变量不同,变量名不用括号, 语法:$$变量名
代码清单:
----------------------------------------------------------------------------------------------------------------------
TEMPDIR       = $$(TRAINDEVHOME)/obj/chapter02/ks02_04
OBJECTS_DIR = $$TEMPDIR
----------------------------------------------------------------------------------------------------------------------
请注意:
1) 在一行语句中,所引用的变量或环境变量的个数不能超过1个,
错误的写法:
       CHAPTER   = chapter02
TEMPDIR      = $$(TRAINDEVHOME)/obj/$$CHAPTER/ks02_04
正确的写法:
       TEMPDIR      = $$(TRAINDEVHOME)/obj/chapter02/ks02_04

2) 使用环境变量的语法跟使用变量的语法不同:
       环境变量: $$(环境变量名)
       变量:        $$变量名

4, 函数  --- pri中提供的常用函数
       在上面的示例中,我们介绍了isEmpty()函数、error()函数,实际上Qt还提供了一些其他函数
       1) isEmtpy()  
用来判断一个变量是否为空值,比如:
代码清单:
----------------------------------------------------------------------------------------------------------------------
DEVHOME = $$(TRAINDEVHOME)
isEmpty(DEVHOME) {
       error('TRAINDEVHOME'环境变量必须被定义.)
}
----------------------------------------------------------------------------------------------------------------------
       2) equals(a, b)
       判断某个变量的 值是否与指定值相等,比如:
代码清单:
----------------------------------------------------------------------------------------------------------------------
BUILDTYPE = $(TRAINBUILDTYPE)
equals(BUILDTYPE, debug){
       CONFIG += debug
       CONFIG -= release
}
----------------------------------------------------------------------------------------------------------------------

       3)  error()
       用来输出错误信息,并终止当前命令,比如:
代码清单:
----------------------------------------------------------------------------------------------------------------------
       isEmpty(DEVHOME) {
       error('TRAINDEVHOME'环境变量必须被定义.)
}
----------------------------------------------------------------------------------------------------------------------

       4)  contains(x, y)
       用来判断一个变量x是否包含字符串y,比如下面的配置表示如果TRAIN _QMAKESPEC变量包含” hpux.* ”,则执行括号中的配置:
代码清单:
----------------------------------------------------------------------------------------------------------------------
contains(TRAIN_QMAKESPEC, hpux.* ) {
       # HPUX下全面支持C++
       QMAKE_CXXFLAGS *= -Aa
       LIBS += -lrt
}
----------------------------------------------------------------------------------------------------------------------


5, unix/win32  --- 配置不同平台下的编译配置项
代码清单:
----------------------------------------------------------------------------------------------------------------------
unix{
       contains( TRAIN_QMAKESPEC, g++) {
              CONFIG *=precompile_header
       }
}
#WIN32下声明使用预编译头文件
win32{
       CONFIG *= precompile_header
}
----------------------------------------------------------------------------------------------------------------------
注:
    1)  linux也使用unix配置。
    2)  所有的左括号“{”,跟起始配置在同一行,不要换行。

6, DEFINES --- 在pri中定义宏
       可以根据需要定义宏定义,这些宏定义可以在源代码中使用,比如
代码清单:
----------------------------------------------------------------------------------------------------------------------
#UNIX下编译设置
unix{
       #表示unix或linux操作系统
       DEFINES *= unix  __unix
}
#WIN32下编译设置
win32{
    #表示WINDOWS操作系统
       DEFINES *= WIN32
}
equals(BUILDBIT,64){
       DEFINES *= TRAIN_64
}
----------------------------------------------------------------------------------------------------------------------
       在上述代码中,在pri中定义的宏定义" unix"、" __unix "、"WIN32"、"TRAIN_64"都可以在代码中使用,比如:
代码清单:
----------------------------------------------------------------------------------------------------------------------
#ifdef  __unix
       ……
#endif

#ifdef  TRAIN_64
       ……
#endif
----------------------------------------------------------------------------------------------------------------------

注:
    1)  DEFINES后面是 *=,(就是 星号=),用来表示累加。
2) 所有的左括号“{”,跟起始配置在同一行,不要换行。如箭头所示。


7, CONFIG的参数项
       CONFIG配置项在pri中与pro中用法一样。
       常用的参数:
       CONFIG  += console qt debug release thread warn_on
1)  console: 表示本应用是命令行程序,可以启动一个终端。
2)  qt:          表示本应用要加载Qt的库,链接时要链接qt类库。
3)  debug/release:表示程序是debug版本还是release版本。
4)  thread:表示程序是否启用多线程,如果没有thread选项,那么程序无法使用多线程。
5)  warn_on:表示是否显示编译警告。个人建议开启,因为有些编译警告还是很重要的,如果不关注,可能导致运行时异常。

8, QMAKE_CXXFLAGS  --- 配置编译警告
       用来为编译器指明一些处理标志,比如:
代码清单:
----------------------------------------------------------------------------------------------------------------------
# ui 生成的文件使用 utf-8 编码,编译时产生 4819 警告,去掉
QMAKE_CXXFLAGS *= -wd4819

# 去掉 strcpy 等编译警告
QMAKE_CXXFLAGS *= -wd4996
----------------------------------------------------------------------------------------------------------------------

结语
----------------------------------------------------------------------------------------------------------------------
      在进行项目级别的编码时,pri文件是非常常用的。当然,如果您仅仅在编写一个独立的exe模块,pri文件可能不会发挥太大作用,但是小编还是建议大家养成习惯,编码时要做到标准化,比如建立一套pri文件体系,这样在建立新项目时将会非常方便,这些内容我们将在下一节介绍。现在,我们先来回顾一下本节的注意事项:
       1)  pri文件路径中的目录分隔符要用"/",请不要使用"\"。
       2)  pri文件只能被pro文件或另一个pri文件引用。
3) 使用环境变量的语法跟使用变量的语法不同:
       环境变量: $$(环境变量名)
       变量:        $$变量名
       4)  在pro或pri中,Qt提供了一些函数来方便判断或者输出信息,比如 isEmpty()、error()等。
       5)  在使用CONFIG的配置项进行判断时,所有的左括号“{”,跟起始配置在同一行,不要换行。
       6)  在pri中定义的宏可以在代码中使用
       好了,总结就到这里,祝大家编程愉快。


上一节:KS02-04   pro 文件常用配置
下一节:KS02-06   一劳永逸:引入pri体系

回复

使用道具 举报

累计签到:50 天
连续签到:1 天
2018-10-9 15:30:26 显示全部楼层
老师我发现我看不懂呢。
C:\Users\Administrator\Desktop\qqqq.png
回复 支持 反对

使用道具 举报

累计签到:50 天
连续签到:1 天
2018-10-9 15:31:59 显示全部楼层
怎么这儿不能上传图片啊?    我是想问老师用的什么编译环境了。  
D:\Qt\Qt5.8.0\Tools\QtCreator\bin\qtcreator.exe

我是菜鸟请老师多截图,讲详细点哇。    
回复 支持 反对

使用道具 举报

累计签到:50 天
连续签到:1 天
2018-10-9 15:33:22 显示全部楼层
主要是我想打开我的软件,模仿老师的操作,我可不知道从哪里操作啊?   :

点评

我用的是VS2017的IDE。您可以看KS02_07。  详情 回复 发表于 2018-10-9 18:08
回复 支持 反对

使用道具 举报

累计签到:41 天
连续签到:1 天
2018-10-9 18:08:16 显示全部楼层
本帖最后由 baizy77 于 2018-10-9 21:54 编辑
tan 发表于 2018-10-9 15:33
主要是我想打开我的软件,模仿老师的操作,我可不知道从哪里操作啊?   : ...

很抱歉,我对QTCreator并不熟悉,我用的是VS2017的IDE。您可以看KS02_07。本文是比较理论性的内容,如果你对本文有不明白的内容,可以直接QQ找我:1309547563。加好友时请注明: Qt开源社区。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了