第04天 使用pro文件与pri文件开发项目
视频讲解
今天要学习的案例对应的源代码目录:src/chapter02/ks02_03。本案例不依赖第三方类库。程序运行效果如图2-20所示。
图2-20 第04天案例程序运行效果
今天的目标是掌握如下内容。
- pro文件、pri文件的相同点及区别。
- 将ks02_03原始代码(src.baseline中代码)改造为依赖project_base.pri。
建议:关于pro文件、pri文件常用配置,以及pri体系的更多知识,请先查阅配套资源中【附录.pdf】文档中的【附录D】。
1.pro文件与pri文件的异同
pro文件与pri文件都是Qt的项目配置文件,它们的语法格式相同。不同之处在于pro文件一般用作单个项目的配置文件,而pri文件用来描述多个项目的公共配置项。比如,项目的公共include目录、是否启用C++ 11支持、预处理指令、公共临时文件存放目录等内容可以用pri文件进行配置。pro文件可以引用pri文件,一个pri文件也可以引用另一个pri文件。除了作为单个项目的配置文件,pro文件有时也被用作整个项目的配置文件,但是它的功能与内容跟pri文件不同。假设某个项目为myproject,该项目包含3个子项目模块(即3个子目录)module_a、module_b、module_c,那么myproject.pro就可以写成如代码清单2-3所示的内容。其中,TEMPLATE=subdirs表示该项目文件用来描述子项目的目录列表,子目录的具体描述见SUBDIRS配置项。
代码清单2-3
当需要在项目module_a的pro中引用pri文件时,可以按如下方式编写代码。
// module_a.pro
include ($$(PROJECT_DEV_HOME)/src/project_base.pri)
其中$$(PROJECT_DEV_HOME)表示引用环境变量PROJECT_DEV_HOME,其语法为$$(环境变量)。假设PROJECT_DEV_HOME=d:/project_home,那么将上述代码展开后得到include(d:/project_home/src/project_base.pri)。另一种方法是使用相对目录的语法进行描述。如果项目中的某个子模块common所在的目录为d:/project_home/src/base/common,而project_base.pri的全路径为d:/project_home/src/project_base.pri,根据两者的相对目录关系,可以将common.pro写成如代码清单2-4所示的内容。其中,根据project_base.pri与common模块所在目录的相对位置关系描述了project_base.pri的全路径。但是,本书推荐使用环境变量的方式,这是因为当common模块所在的目录发生变化时,如果忘记更新代码清单2-4中标号①处的代码,就会导致该行代码出现解析错误,从而带来不必要的麻烦。
代码清单2-4
2.将ks02_03原始代码改造为依赖pri文件
为了方便统一处理,编写project_base.pri作为公共pri文件,供后续各个案例引用。project_base.pri完整文件见配套资源中源代码包,此处仅介绍在项目中引用该pri时需要注意的事项。代码清单2-5,展示了project_base.pri的部分内容。
代码清单2-5
下面分为两种情况介绍project_base.pri。
1)允许使用环境变量的情况
如果项目中允许使用环境变量,就设置3个环境变量,PROJECT_DEV_HOME、PROJECT_BUILD_TYPE、PROJECT_BUILD_BIT,如代码清单2-5中标号①、标号②、标号③处所示。其中PROJECT_DEV_HOME表示项目根目录,即bin目录的上级目录。PROJECT_BUILD_TYPE表示生成Debug版还是Release版,取值范围为debug|release|all,其中all表示两种版本都生成。PROJECT_BUILD_BIT表示生成32位程序还是64位程序,取值32或64。关于这3个环境变量的更多内容,请见配套资源中【附录.pdf】文档中的【32位/64位程序的区分方法】。
设置好环境变量后,就可以在ks02_03.pro中引用该pri文件了,见代码清单2-6中标号①处。这里先在前一行定义变量PROJECT_HOME,然后使用$$变量的语法描述project_base.pri文件的全路径。使用include语句引用pri文件时,应按照include(pri文件全路径)的方式,请注意pri文件全路径要使用括号。在标号②处引用project_base.pri中定义的变量PROJECT_BIN_PATH来配置DESTDIR,所有案例都可以统一使用该配置。在标号③处定义变量TEMPDIR用来表示构建该项目时产生的临时文件的存放目录,这样OBJECTS_DIR、MOC_DIR、UI_DIR就可以引用变量TEMPDIR来进行配置。OBJECTS_DIR、MOC_DIR、UI_DIR分别用来描述构建项目时生成的临时文件根目录、Qt的moc命令生成的临时文件目录、编译项目资源文件时生成的临时文件目录。当需要同时构建项目的Debug版、Release版目标程序时,Qt就会使用标号④、标号⑤处的配置,其中标号④处配置了Debug版的目标程序名称,标号⑤处配置了Release版的目标程序名称;当仅构建Debug版的项目目标程序时,Qt会使用标号⑥处的配置;当仅构建Release版的项目目标程序时,Qt会使用标号⑦处的配置。
注意:项目的Debug版与Release版应配置不同的目标程序名称。
代码清单2-6
2)不允许使用环境变量的情况
如果不希望在项目中使用环境变量,可以定义变量PROJECT_HOME用来指明项目的根目录,也就是bin、lib、src的上级目录,如代码清单2-7中标号①处所示。需要根据当前项目目录与项目根目录的相对位置关系配置PROJECT_HOME。比如,标号①处的配置表明,当前子项目(模块)目录再往上级目录移动3次,才是整个项目的根目录。在标号②处,使用该变量描述了projecr_base.pri文件的全路径。另外,在project_base.pri中也引用PROJECT_HOME变量,见代码清单2-5中标号④处。这样就带来一定的灵活性,如果在子模块的pro中配置PROJECT_HOME,那么就无须在系统中配置环境变量PROJECT_HOME。project_base.pri中还用到了另外两个环境变量,PROJECT_BUILD_TYPE、PROJECT_BUILD_BIT,前者用来表示构建Debug版还是Release版的目标程序,后者表示构建的程序位数是32位还是64位。如果希望将这两个值配置为固定值,可以直接在代码清单2-5中标号⑤、标号⑥处进行配置。PROJECT_BUILD_TYPE的取值为debug|release|all这3个值中的一个。另外,如果不希望向系统中添加环境变量,还可以编写构建项目用的脚本,并在脚本中配置环境变量的值,然后利用脚本来构建整个项目。
代码清单2-7
注意:如果某个项目未使用Qt的类,则可以仅在编译程序的机器上安装Qt,不需要在部署程序的机器上安装Qt。这个项目的pro中,可以配置成CONFIG-=qt。