一、 *.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 = propriprfprlinclude(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

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

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

    尽管每次和cmake对比起来,我们总是说 qmake 简单.功能少.但是qmake仍然是一个非常复杂的东西,我想大多人应该和我一样吧: 不是太清楚CONFIG等变量到底如何起作用的 用过的qmake内 ...

  2. Qt浅谈之八:富文本转换成pdf

    一.简介 Qt对富文本的处理,主要有几个感兴趣的知识点才写下这篇文章,将文本或图片转换成pdf格式.文件直接拖拽到文本框中.双击对程序全屏和缩小.滚动滑轮对文字放大缩小及安装事件过滤器通过键盘的上下按 ...

  3. Qt浅谈之十三:抓图截屏

    一.简介 因Windows下无法登录QQ时就不能抓图了,就很纠结了,而在Linux下,有时也无法抓图.所以专门使用Qt仿照Centos的抓图界面写了一个抓图软件,能实现自己的大部分需求.感兴趣的可以扩 ...

  4. Qt浅谈之一:内存泄露(总结)

    一.简介        Qt内存管理机制:Qt 在内部能够维护对象的层次结构.对于可视元素,这种层次结构就是子组件与父组件的关系:对于非可视元素,则是一个对象与另一个对象的从属关系.在 Qt 中,在 ...

  5. Qt浅谈之三十系统托盘(QSystemTrayIcon)

    一.简介 Qt自带的例子/usr/lib64/qt4/examples/desktop/systray中详尽介绍了系统托盘的功能,在其基础上进行拓展,定制适合自己的系统托盘.        托盘菜单实 ...

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

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

  7. Qt浅谈之二:钟表(时分秒针)

    一.简介 QT编写的模拟时钟,demo里的时钟只有时针和分针,在其基础上添加了秒针,构成了一个完整的时钟.能对2D绘图中坐标系统.平移变换(translate).比例变换(scale).旋转变换(ro ...

  8. Qt浅谈之三十九圆形进度条

    一.简介 Qt下进度条一般都是水平或垂直的,有时需要一个椭圆或圆来动态显示进度,或用此来显示存储百分比,都是比较适用的. 二.详解 1.代码 (1)widgetdisplay.h #ifndef WI ...

  9. Qt浅谈之三十六仿360设置中心

    一.简介 模仿360设置中心面板的功能:左侧导航使用QTreeWidget,右侧的显示区域使用QScrollArea控件:主要使用垂直滚动条的valueChanged事件和QTreeWidget的it ...

最新文章

  1. JavaScript中十种一步拷贝数组的方法
  2. Android多线程:深入分析 Handler机制源码(二)
  3. 当我们做MVP产品时,我们到底在做什么?
  4. 分布式一致性算法:Raft 算法
  5. dd , /dev/zero和/dev/null
  6. 2.3)深度学习笔记:超参数调试、Batch正则化和程序框架
  7. Fence Repair(POJ-3253)
  8. DeFi 协议 Benchmark Protocol 启动第二阶段流动性挖矿计划 The Press
  9. 面对疫情等群体性危机,程序员如何在家高效办公?
  10. [转载] python set()集合快速比较两个列表内的元素是否一致
  11. waitpid最后以一个参数设为0_变频器用远传压力表控制恒压供水参数设置
  12. python数据库查询系统_基于Python和MySQL实现的学生信息管理系统
  13. 赛思永盛120G固体硬盘拆解,YS9082HC主控方案,布局很像公版2258XT和2259XT
  14. QT下assimp库的模型加载
  15. 0ctf Babyheap 2017
  16. Robot Framework Selenium UI自动化测试 --- 实战篇
  17. Uni-app fly 接口封装
  18. 设计模式之十三观察者模式
  19. 谈谈在我在外包公司工作的经历
  20. 小程序实现实名、支付及签约

热门文章

  1. yum与rpm的详解 --用来安装软件
  2. 从几个sample来学习Java堆,方法区,Java栈和本地方法栈
  3. Banana PI 香蕉派项目
  4. jquery 选择器大全的详细说明和实例
  5. C#接口-接口的继承
  6. 前端趋势榜:上周最有意思、又实用的 10 大 Web 项目 - 210922
  7. jQuery入口函数的四种写法【1分钟掌握】
  8. Fiddler抓包工具详解(三)(fiddler监控面板+辅助工具)
  9. 警惕由于使用YYYY-MM-dd引发的一场生产问题
  10. 如何修改 Linkis 依赖的 Spark、Hive 版本?