尽管每次和cmake对比起来,我们总是说 qmake 简单、功能少。但是qmake仍然是一个非常复杂的东西,我想大多人应该和我一样吧:

  • 不是太清楚CONFIG等变量到底如何起作用的
  • 用过的qmake内置变量和函数不超过20个
  • 看Qt Creator源码或者QtSolution等库中自己使用的 *.pro 文件就想看天书一样

本文只能抓住一条线,简单介绍一下 *.pro、*.pri、*.prf、*.prl等四种文件:干嘛用的,如何用的

*.pro

qmake 的工程(project)文件,这个大家肯定都非常熟悉了。那我就不费话了,上例子:

这是一个典型的Qt示例程序的.pro文件(propriprfprl.pro):

TEMPLATE = app
CONFIG += QT
QT += core guiTARGET = propriprfprlSOURCES += main.cpp/widget.cpp
HEADERS  += widget.h
FORMS    += widget.ui
  • 前面3行是qmake的默认值,我们都可以省略
  • TARGET 这行指定工程名,我们也可以省略

*.pri

i 是什么东西?包含(include)的首字母。类似于C、C++中的头文件吧,反正就是我们可以吧 *.pro 文件内的一部分单独放到一个 *.pri 文件内,然后包含进来。

接前面的例子,我们将源文件的设置独立出来,放到propriprfprl.pri文件内:

SOURCES += main.cpp/widget.cpp
HEADERS  += widget.h
FORMS    += widget.ui

这时,我们的 propriprfprl.pro 文件就可以简化为:

TEMPLATE = app
CONFIG += QT
QT += core guiTARGET = propriprfprl
include(propriprfprl.pri)
  • 这有什么用呢?对我们这个例子来说,确实没什么用,反而多了一个文件,更麻烦了。
  • 可是,如果一个大点的项目,含有多个*.pro文件呢,这些pro需要有些共同的设置或需要的文件,这时就很有必要了。

*.prf

f又是神马东东?特性(feature)的首字符

  • 和pri文件类似,该文件也是要被包含进pro文件的
  • 只是:它更隐蔽
  • 你经常和它打交道,可能却一直视而不见

我们这个例子中其实已经用到了,这就是

CONFIG+=QT

当我们在CONFIG中指定一个东西时,qmake就会尝试去加载相应的feature文件:

  • Qt安装目录下的 mkspecs/features/qt.prf
  • features 文件的文件名必须小写
  • qmake 去哪些目录下搜索features文件呢?
    • manual中有介绍,此处略
    • 暂时只知道前面提到的 $$QTDIR/mkspecs/features 就可以了

写一个自己的features文件:propriprfprl.prf

win32:CONFIG += console
  • 为win32的程序添加控制台,有点多次一举哈。
  • 将该文件放置到我们前面提到的目录中

然后在pro文件内添加

CONFIG += propriprfprl

看到和 CONFIG += console 同样的效果了吧?

注:我们也可以使用 load命令来加载prf文件,比如前面的命令可以认为等价于

load(propriprfprl)

*.prl

l 这个东西容易理解,链接(link)的首字符。主要和生成与使用静态库密切相关(动态库也可以有该文件,去Qt安装目录下的lib目录下看看即可)。

  • 生成静态库时,我们需要使用下列配置(进而生成和库文件同名的 *.prl 文件)
CONFIG += create_prl
  • 当工程的TEMPLATE为app时,会自动添加如下指令(找库文件的时候,会尝试找相应的 *.prl 文件)
CONFIG += link_pri

那么该文件有什么用处呢?举一个大家可能熟悉的例子QextSerialPort1.2这个库(windows下的情况):

  • 编译时,需要 setupapi.lib advapi32.lib user32.lib 这几个库文件
  • 编译成静态库以后,它本身是不包含这3个库文件信息的
  • 于是,当我们使用这个 QextSerialPort 静态库,还是需要指定 这几个库文件

如果有prl文件呢,该文件就会包含依赖信息了,我们看一下:

QMAKE_PRL_BUILD_DIR = E:/dbzhang800-qextserialport/buildlib
QMAKE_PRO_INPUT = buildlib.pro
QMAKE_PRL_TARGET = qextserialport-1.2
QMAKE_PRL_CONFIG = include_source_dir incredibuild_xge lex yacc warn_on uic resources incremental_off windows release ReleaseBuild Release build_pass qt warn_on release incremental flat link_prl precompile_header autogen_precompile_source copy_dir_files debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe stl exceptions rtti mmx 3dnow sse sse2 release ReleaseBuild Release build_pass qt qextserialport-buildlib create_prl qextserialport-uselib qextserialport-static static debug_and_release build_all release ReleaseBuild Release build_pass no_autoqmake staticlib static moc thread
QMAKE_PRL_LIBS = setupapi.lib advapi32.lib user32.lib d://Qt//4.7.0//lib//QtGui4.lib d://Qt//4.7.0//lib//QtCore4.lib 

参考

  • qmake manual:qmake-advanced-usage.html
  • qmake manual:qmake-variable-reference.html
  • http://www.qtcentre.org/wiki/index.php?title=Undocumented_qmake

浅谈 qmake 之 pro、pri、prf、prl文件相关推荐

  1. IDE / Qt / 浅谈 qmake 之 pro、pri、prf、prl文件

    一. *.pro qmake 的工程(project)文件,栗子: 这是一个典型的 Qt 示例程序的 .pro 文件(propriprfprl.pro): TEMPLATE = app CONFIG ...

  2. 浅谈VMware Workstation Pro 使用Linux系统(超详细教程)

    Vmware Workstation Pro 使用Linux系统 ·····················分割线······················· 目录: VMware Workstat ...

  3. 浅谈Android项目中的build.gradle文件

    一.gradle简介 gradle是基于groovy语言的. Android Studio是采用Gradle来构建项目的.Gradle是一个非常先进的项目构建工具,使用了一种基于Groovy的领域特定 ...

  4. python批量处理txt_浅谈Python批处理文件夹中的txt文件

    1 文件处理形式 近期由于处理大量数据,所以对于采用python进行处理文件的一些操作也打算整理一下:接下来主要说一下如何处理目录下的一系列txt文件.首先看一下我们将要处理目录下的15个类似的数据文 ...

  5. html5 上传 原理,浅谈使用HTML5的FormData上传文件原理!!!

    [书山有路勤为径,学海无涯苦作舟] //一.FormData背景介绍 //表单提交,文件上传是一个常用又十分麻烦的功能,以前要上传文件通常都是借助插件或者flash来实现,噼里啪啦的加载一大堆东西.自 ...

  6. 浅谈HTTP FTP和P2P网络大文件传输的优劣势

    随着各种行业和硬件设备的发展,大文件越来越多,比如在媒体行业为了保证图片和视频的清晰,和以前的相比,都比较大,尤其是出版社等行业.确保文件能快速的传输,现在很多企业还是使用的硬盘邮寄的方式.如果使用网 ...

  7. linux cp mv区别,浅谈Linux下mv和cp命令的区别

    1.功能上的区别 mv:用户可以使用该命令为文件或目录重命名或将文件由一个目录移入另一个目录中. cp: 该命令的功能是将给出的文件或目录拷贝到另一文件或目录中. 2.从inode角度来区分 mv:会 ...

  8. Qt之pro、pri、prf、prl文件简解

    pro文件 QT工程的pro文件,在创建工程时由QTCreater自动创建,我们可以往里面添加内容,增加库文件的声明,包含路径.预处理器定义,生成目录,输出中间目录等等设置. 注释: 以"# ...

  9. 【QT】详解 *.pro、*.pri、*.prf、*.prl文件

    1.*.pro qmake 的工程(project)文件,这个大家肯定都非常熟悉了.直接上例子: 这是一个典型的Qt示例程序的.pro文件(propriprfprl.pro): TEMPLATE = ...

最新文章

  1. AI 时代保护儿童刻不容缓!智源研究院发布我国首个儿童人工智能发展原则《面向儿童的人工智能北京共识》...
  2. Nginx和Tengine
  3. C语言中static的作用及C语言中使用静态函数有何好处
  4. 德勤发布2021年度企业AI应用现状报告,AI驱动已成竞争必需品
  5. javascript-演练-二级联动下拉框
  6. 详解vmware安装
  7. python 编辑距离 2组匹配_Python文本相似性计算之编辑距离详解
  8. Yahoo!用户体验与设计前副总裁推荐——《设计模式》
  9. c语言音乐程序天空之城,51单片机演奏天空之城 c语言源程序
  10. XML外部实体(XXE)注入详解
  11. C++中break与continue的用法
  12. 后渗透篇:CLSID大全
  13. 自动提交flag-python
  14. ON [PRIMARY]是表示....
  15. 智慧物流:RFID智能仓储物流管理-RFID仓库管理解决方案-新导智能
  16. bootstrap5基本使用
  17. kali_linux 的简单美化,Kali_linux 的简单美化
  18. cs5 dreamweaver ox_dreamweavercs5下载
  19. 使用 iTunes 制作铃声
  20. 有用友T6账套备份,如何判断版本?

热门文章

  1. 计算机二级第36套题
  2. 控制工程基础学习笔记-第2章 控制系统的动态数学模型
  3. 4.起步时最重要的是什么?
  4. 中e管家家庭理财的小方法
  5. 为什么智能音箱开始走向户外?
  6. ZKEYS公有云分销系统授权详细流程
  7. B端大屏可视化设计参考网站分享、大数据可视化设计
  8. 笔记:NB-IOT常用AT命令
  9. Numpy模块的学习(下)
  10. 深圳大学计算机考研三本,三本生两次考研终入211的励志故事