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

转载自:http://blog.csdn.net/dbzhang800/article/details/6348432

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

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

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

*.pro

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

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

  1. TEMPLATE = app
  2. CONFIG += QT
  3. QT += core gui
  4.  
  5. TARGET = propriprfprl
  6.  
  7. SOURCES += main.cpp/
  8. widget.cpp
  9. HEADERS += widget.h
  10. FORMS += widget.ui
  • 前面3行是qmake的默认值,我们都可以省略
  • TARGET 这行指定工程名,我们也可以省略

*.pri

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

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

  1. SOURCES += main.cpp/
  2. widget.cpp
  3. HEADERS += widget.h
  4. FORMS += widget.ui

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

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

*.prf

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

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

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

  1. CONFIG+=QT

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

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

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

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

然后在pro文件内添加

  1. CONFIG += propriprfprl

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

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

  1. load(propriprfprl)

*.prl

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

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

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

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

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

  1. QMAKE_PRL_BUILD_DIR = E:/dbzhang800-qextserialport/buildlib
  2. QMAKE_PRO_INPUT = buildlib.pro
  3. QMAKE_PRL_TARGET = qextserialport-1.2
  4. 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
  5. 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

参考

http://blog.csdn.net/wsh6759/article/details/7432269

浅谈qmake之pro、pri、prf、prl文件的更多相关文章

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

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

  2. 浅谈 qmake 之 shadow build(将源码路径和构建路径分开,一套源码要分别用msvc2008、msvc2008、mingw分别编译又不互相干扰)

    shadow build shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁. 这不是qmake ...

  3. 浅谈 qmake 之 shadow build

    shadow build shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁. 这不是qmake ...

  4. 浅谈 qmake 之 shadow build(就是将源码路径和构建路径分开)

    shadow build shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁. 这不是qmake ...

  5. 浅谈VC++中预编译的头文件放那里的问题分析

    用C++写程序,肯定要用预编译头文件,就是那个stdafx.h.不过我一直以为只要在.cpp文件中包含stdafx.h 就使用了预编译头文件,其实不对.在VC++中,预编译头文件是指放到stdafx. ...

  6. Qt3升至Qt4需要注意的几件事项浅谈

    Qt3升至Qt4需要注意的几件事项浅谈 公司以前的项目是用Qt3写的,随着时间的推移慢慢显示出Qt3有多方面的限制,因此先公司决定用Qt4来改写这个项目,并为软件添加新功能,在此背景先编写此文章. 先 ...

  7. 浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真

    浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真 工作内容: Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业 ...

  8. JavaScript中toStirng()与Object.prototype.toString.call()方法浅谈

    toStirng()与Object.prototype.toString.call()方法浅谈 一.toString()是一个怎样的方法?它是能将某一个值转化为字符串的方法.然而它是如何将一个值从一种 ...

  9. 浅谈Kotlin(一):简介及Android Studio中配置

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 今日新闻:谷 ...

随机推荐

  1. 理解MySQL——索引与优化(转)

    写 在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页 面大小为4K,并存储100条记录.如果没有索引,查 ...

  2. C++ 类访问控制(public/protected/private)

    第一:private, public, protected 访问标号的访问范围. private:只能由1.该类中的函数.2.其友元函数访问. 不能被任何其他访问,该类的对象也不能访问. protec ...

  3. Linux(Fedora)下NodeJs升级最新版本(制定版本)

    Linux(Fedora)下NodeJs升级最新版本(制定版本) 首先安装n模块: npm install -g n 升级node.js到最新稳定版 n stable 升级node.js到制定版本 n ...

  4. Android Linux自带iptables配置IP访问规则

    利用Linux自带iptables配置IP访问规则,即可做到防火墙效果

  5. java入门(与C++的不同之处)封装篇

    初学java,总是想将它与之前的C++做比较,看了慕客网的java入门视频,一直觉得在面向对象方面,它和C++有太多相同的地方,结果今天学到了两点不同之处,现在将它记录下来: 1.  java的访问修 ...

  6. 转载:如何避免代码中的if嵌套

    http://top.jobbole.com/4960/ http://stackoverflow.com/questions/24430504/how-to-avoid-if-chains 在Sta ...

  7. 用Enterprise Architect从源码自动生成类图

    http://blog.csdn.net/zhouyong0/article/details/8281192 /*references:感谢资源分享者.info:简单记录如何通过工具从源码生成类图,便 ...

  8. 解压Windows的install.wim文件

    转自无需软件,解压Win8/Win8.1的install.wim文件 一.检查镜像版本: 镜像中包含多个版本,需要确认自己需要的版本,我的镜像路径是"F:\win8.1\sources\in ...

  9. Android数据存储之文件存储

    首先给大家介绍使用文件如何对数据进行存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的. public ...

  10. touchend事件的preventDefault阻止掉了click事件

    <div id="box">box</div> <script> var isTouchDevice = function() { return ...