浅谈 qmake 之 pro、pri、prf、prl文件
尽管每次和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 gui TARGET = propriprfprl SOURCES += 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 gui TARGET = 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文件的更多相关文章
- 浅谈qmake之pro、pri、prf、prl文件
浅谈qmake之pro.pri.prf.prl文件 转载自:http://blog.csdn.net/dbzhang800/article/details/6348432 尽管每次和cmake对比起来 ...
- 浅谈 qmake 之 shadow build(将源码路径和构建路径分开,一套源码要分别用msvc2008、msvc2008、mingw分别编译又不互相干扰)
shadow build shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁. 这不是qmake ...
- 浅谈 qmake 之 shadow build
shadow build shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁. 这不是qmake ...
- 浅谈 qmake 之 shadow build(就是将源码路径和构建路径分开)
shadow build shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁. 这不是qmake ...
- 浅谈VC++中预编译的头文件放那里的问题分析
用C++写程序,肯定要用预编译头文件,就是那个stdafx.h.不过我一直以为只要在.cpp文件中包含stdafx.h 就使用了预编译头文件,其实不对.在VC++中,预编译头文件是指放到stdafx. ...
- Qt3升至Qt4需要注意的几件事项浅谈
Qt3升至Qt4需要注意的几件事项浅谈 公司以前的项目是用Qt3写的,随着时间的推移慢慢显示出Qt3有多方面的限制,因此先公司决定用Qt4来改写这个项目,并为软件添加新功能,在此背景先编写此文章. 先 ...
- 浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真
浅谈用ModelSim+Synplify+Quartus来实现Altera FPGA的仿真 工作内容: Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业 ...
- JavaScript中toStirng()与Object.prototype.toString.call()方法浅谈
toStirng()与Object.prototype.toString.call()方法浅谈 一.toString()是一个怎样的方法?它是能将某一个值转化为字符串的方法.然而它是如何将一个值从一种 ...
- 浅谈Kotlin(一):简介及Android Studio中配置
浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 今日新闻:谷 ...
随机推荐
- Zookeeper Hello World
1.Zookeeper的安装使用 在官网上下载zk的安装包(http://labs.renren.com/apache-mirror/zookeeper/),解压后cd到zk的目录下. 单机版安装方法 ...
- EF selection expression 与 Linq备忘
一.左连接查询 var query = people.GroupJoin(pets, person => person, pet => pet.Owner, (person, petCol ...
- erlang代码片段
转载自http://blog.csdn.net/sw2wolf/article/details/6797708 .列表操作 lists:foreach(fun(X) -> io:format(& ...
- ipc.Client: Retrying connect to server: h1/192.168.1.61:9000. Already tried 0 time(s);解决方法
1.检查namenode服务器的是否运行正常,我的问题是没有开启hadoop集群出现的. 2.检查namenode服务器的防火墙是否开放的响应端口,一般内网建议关闭.
- Improved logging in Objective-C
[Improved logging in Objective-C] Example of logging the current method and line number. Paste it in ...
- -g vs -rdynamic
[-g vs -rdynamic] -g选项与-rdynamic选项的差别:1,-g选项新添加的是调试信息(一系列.debug_xxx段),被相关调试工具,比如gdb使用,可以被strip掉. 2,- ...
- Java断言assert
public class Welcome{ public static void main(String[] args){ assert false; System.out.println(" ...
- 查看80端口被占用的方法(IIS、apmserv、system)
端口如果被其他程序占用就不能正常启动,比如有时启动时会提示WEB启动失败,其实就是80 端口被占用了,而迅雷等下载软件恰恰就是占用了80端口,关掉就行了.但有时迅雷等都没有开 也启动不了,那就是别的东 ...
- jshint 安装使用
首先要安装nodjs, 参考另一篇文章: Ubuntu 编译安装node.js 然后运行 npm install jshint -g 之后在要扫描的目录下运行命令 jshint . >> ...
- 配置Synergy(Server : XP, client: Win7)
此文只是为了Mark一下配置方法,以防以后重装系统的时候,忘记. 首先,因为我的Server机器是XP,所以要求两台机器,都是安装的x86的版本,而不能是x64的版本. 我用的版本是1.4.11, ...