qt creator源码全方面分析(3-5)
qtcreatorlibrary.pri
上一章节,我们介绍了src.pro,这里乘此机会,把src目录下的所有项目文件都介绍一遍。首先为qtcreatorlibrary.pri。
使用实例
为了分析这个文件,我们找个使用该pri的例子,源目录\src\libs\cplusplus\cplusplus.pro
DEFINES += NDEBUG
unix:QMAKE_CXXFLAGS_DEBUG += -O2
win32:QMAKE_CXXFLAGS_DEBUG += -O2
include(../../qtcreatorlibrary.pri)
include(cplusplus-lib.pri)
以及依赖项,源目录\src\libs\cplusplus\cplusplus_dependencies.pri
QTC_LIB_NAME = CPlusPlus
QTC_LIB_DEPENDS += \
utils
INCLUDEPATH *= $$IDE_SOURCE_TREE/src/libs/3rdparty
这里我们可以看见,设置了库名QTC_LIB_NAME和依赖的库名QTC_LIB_DEPENDS,这在qtcreator.pri中解析依赖时会用到的。
上半部
下面,我们来分析qtcreatorlibrary.pri,这里分为两部分来介绍。
上半部分如下
include($$replace(_PRO_FILE_PWD_, ([^/]+$), \\1/\\1_dependencies.pri))
TARGET = $$QTC_LIB_NAME
include(../qtcreator.pri)
# use precompiled header for libraries by default
isEmpty(PRECOMPILED_HEADER):PRECOMPILED_HEADER = $$PWD/shared/qtcreator_pch.h
win32 {
DLLDESTDIR = $$IDE_APP_PATH
}
DESTDIR = $$IDE_LIBRARY_PATH
注意:此变量仅适用于Windows目标。
指定要将目标dll复制到的位置。
指定放置目标文件的位置。
例如:
DESTDIR = ../../lib
注意:支持的字符列表可能取决于所使用的构建工具。 特别是,括号不适用于make工具。
根据pro文件名获取对应的依赖文件,进行包含。
_PRO_FILE_PWD_为包含该pri的pro所在的文件夹路径,([^/]+$)表示路径中最后一个分隔符后面的字符串,\1为反向引用,代表所获取的第1个匹配的引用。
示例:_PRO_FILE_PWD_为源目录/src/libs/cplusplus,包含文件为源目录/src/libs/cplusplus/cplusplus_dependencies.pri,匹配项为cplusplus。
设置库文件名。
示例:CPlusPlus。
加载qtcreator.pri。
具体内容见往期文章qt creator源码全方面分析(3-2)。
这里重点提示下,第一步加载的依赖文件中,设置了QTC_LIB_DEPENDS,那么在qtcreator.pri会进行依赖解析(utils库),并进行包含。
添加预编译头文件。
示例:源目录/src/shared/qtcreator_pch.h。内容就是一些常用的统一的Qt头文件。
设置DLL目标文件夹。
如果win32平台,且生成的目标是dll,则把该dll拷贝到IDE_APP_PATH中,即构建目录/bin。
设置目标文件夹。
把生成的目标,输出到IDE_LIBRARY_PATH,即构建目录/lib/qtcreator。
下半部
下半部分如下
osx {
QMAKE_LFLAGS_SONAME = -Wl,-install_name,@rpath/Frameworks/
QMAKE_LFLAGS += -compatibility_version $$QTCREATOR_COMPAT_VERSION
}
include(rpath.pri)
TARGET = $$qtLibraryTargetName($$TARGET)
TEMPLATE = lib
CONFIG += shared dll
contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols
win32 {
dlltarget.path = $$INSTALL_BIN_PATH
INSTALLS += dlltarget
} else {
target.path = $$INSTALL_LIBRARY_PATH
INSTALLS += target
}
osx设置和rpath.pri,设置编译选项,略。
设定输出目标的文件名。
这里调用了qtcreator.pri中定义的qtLibraryTargetName()函数,其实就是在debug模式下添加字符d,以区分release模式。函数分析见qt creator源码全方面分析(3-2)。
设定输出类型,为共享lib库。
设置隐藏导出符号选项。
设置安装路径。
结果
在构建目录中,我们在DLLDESTDIR和DESTDIR指定的两处地方找到了编译得到的库。

我们在cplusplus.pro包含qtcreatorlibrary.pri,在pri中加载cplusplus_dependencies.pri,然后加载qtcreator.pri,并在其中解决依赖,最终加载utils_dependencies.pri,项目目录架构结果如下。

原创造福大家,共享改变世界
献出一片爱心,温暖作者心灵

qt creator源码全方面分析(3-5)的更多相关文章
- qt creator源码全方面分析(3-3)
目录 qtcreatordata.pri 定义stripStaticBase替换函数 设置自定义编译和安装 QMAKE_EXTRA_COMPILERS Adding Compilers 示例1 示例2 ...
- qt creator源码全方面分析(0)
本人主攻C++和Qt. 上两天刚研究完Qt install framework(IFW)应用程序安装框架. google没发现有正儿八经的官方文档的翻译,我就进行了翻译哈!! 系列文章具体见:http ...
- qt creator源码全方面分析(4-0)
Qt系统 Qt Creator源码是在Qt对象和框架基础下写的,因此,阅读Qt Creator源码,你首先对Qt得有一定的了解. Qt Core Qt Core特征: The Meta-Object ...
- qt creator源码全方面分析(4-2)
目录 global头文件 global.h xx.h global头文件 插件的本质就是动态链接库,对于库,需要导出符号,供用户导入使用.在qt creator的源码中,存在固定的导入导出模式. gl ...
- qt creator源码全方面分析(4-5)
目录 Qt中的字符串 QLatinString 详细介绍 源码 小结 QStringLiteral(str) 详细介绍 源码 小结 Qt中的字符串 Qt中处理字符串最常用的肯定是QString,但是在 ...
- qt creator源码全方面分析(4-6)
目录 Qt插件基础 Qt插件基础 我们知道Qt Creator源码是基于插件架构的,那么我们先来介绍下插件基础知识. 相关内容如下: How to Create Qt Plugins [ - Defi ...
- qt creator源码全方面分析(3-2)
目录 qtcreator.pri 判断重复包含 定义版本信息 VERSION 定义IDE名称 启用C++14 CONFIG 自定义函数 Replace Functions Test Functions ...
- qt creator源码全方面分析(2-7)
目录 Completing Code 补全代码片段 编辑代码片段 添加和编辑片段 删除片段 重置片段 补全Nim代码 Completing Code 在编写代码时,Qt Creator建议使用属性,I ...
- qt creator源码全方面分析(2-10-1)
目录 Getting and Building Qt Creator 获取Qt 获取和构建Qt Creator Getting and Building Qt Creator 待办事项:应该对此进行扩 ...
随机推荐
- 实现一个简易的HashMap
实现一个键的类型为int,值的类型为int的HashMap 输入一个T,表示操作次数: 之后每行接一个操作,可以包括插入.删除.修改.查询.清空.判断是否有这个键: 因为是刚学完随手敲的,所以功能粗糙 ...
- RPC 框架性能大比拼
Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成. Motan 是新浪微博开源的一个Java ...
- HTML5图片预览 放大
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 吴裕雄--天生自然KITTEN编程:对话
- Python建立web静态服务器
原文地址:http://www.bugingcode.com/blog/python_html_web_server.html python作为工具,提供了很多好用的命令,比如有时候突然需要建立一个解 ...
- 数据分析交互工具jupyter notebook需要密码登陆解决办法
想要做数据分析,交互可视化工具jupyter notebook是必不可少的,但是在安装和使用其时候总是会出现各种各样的问题,本文针对notebook启动需要密码的问题进行解决. 首先看一下启动jupy ...
- ypoj 2286 佳佳买菜
题目名称:佳佳买菜 描述 佳佳是我们的ACM社团的副社长,她感觉得自己没存在感,so-由于实验室要聚餐了,佳佳决定买点菜,来做菜给大家吃.佳佳喜欢吃娃娃菜,于是她来到买菜的地方.佳佳:我要10斤娃娃菜 ...
- Gnome Ubuntu16安装Nvidia显卡396驱动,CUDA9.2以及cudnn9.2
深度学习环境配置,安装Nvidia显卡驱动,CUDA以及cudnn OS:ubuntu 16.04;driver: nvidia 396;CUDA: 9.2cudnn: 9.2 卸载原有Nvidia驱 ...
- 美团CodeM 资格赛第一题
美团外卖的品牌代言人袋鼠先生最近正在进行音乐研究.他有两段音频,每段音频是一个表示音高的序列.现在袋鼠先生想要在第二段音频中找出与第一段音频最相近的部分. 具体地说,就是在第二段音频中找到一个长度和第 ...
- Java入门教程九(封装继承多态)
封装 封装就是将对象的属性和方法相结合,通过方法将对象的属性和实现细节保护起来,实现对象的属性隐藏.做法就是:修改属性的可见性来限制对属性的访问,并为每个属性创建一对取值(getter)方法和赋值(s ...