qt creator源码全方面分析(3-8)
项目文件工作流程
我们在前面已经讨论了所有的项目文件,
- qtcreator.pro
- qtcreator.pri
- qtcreatordata.pri
- qtcreatorlibrary.pri
- qtcreatorplugin.pri
- qtcreatortool.pri
下面我们再从头到尾来捋一遍。
多层目录模式
我们可以看到,所有的*.pro文件中,除了最底层的子项目。都采用TEMPLATE和SUBDIRS这种模式,来进行多个子项目包含和分层,以及指定编译顺序。
# qtcreator.pro
TEMPLATE = subdirs
SUBDIRS = src share
# src.pro
TEMPLATE = subdirs
SUBDIRS += \
libs \
app \
plugins \
tools \
...
# libs.pro
TEMPLATE = subdirs
SUBDIRS = \
aggregation \
extensionsystem \
utils \
...
从上往下形成多级目录层次。

依赖解析模式
我们还是以源目录\src\plugins\cppeditor为例。其解析流程如下:
- 通过TEMPLATE和SUBDIRS模式,加载cppeditor.pro。
- 在pro中加载qtcreatorplugin.pri。
include(../../qtcreatorplugin.pri)
在qtcreatorplugin.pri加载cppeditor_dependencies.pri。在该文件中设置了自身插件名和附加依赖项。
QTC_PLUGIN_NAME = CppEditor
QTC_LIB_DEPENDS += \
extensionsystem \
utils \
cplusplus
QTC_PLUGIN_DEPENDS += \
texteditor \
coreplugin \
cpptools \
projectexplorer
QTC_TEST_DEPENDS += \
qmakeprojectmanager
现在就有了QTC_PLUGIN_NAME,QTC_LIB_DEPENDS和QTC_PLUGIN_DEPENDS的值。
紧接着在qtcreatorplugin.pri加载qtcreator.pri。该文件中使用定义的for(ever)和步骤3中获取的变量,进行递归依赖解析。
最终从上往下也形成多级目录层次。

源目录\src\libs中的各个子项目同上。
包含,链接和输出
这里,我们统一分析下INCLUDEPATH,LIBS和DESTDIR。
包含
# qtcreatorplugin.pri
# 为了加载插件元数据json文件
INCLUDEPATH += $$OUT_PWD
# qtcreator.pri
# 包含多个目录
INCLUDEPATH += \
$$IDE_BUILD_TREE/src # 用于包含app/app_version.h
$$IDE_SOURCE_TREE/src
$$IDE_SOURCE_TREE/src/libs \
$$IDE_SOURCE_TREE/tools
# 至少包含src/plugins目录
QTC_PLUGIN_DIRS += $$IDE_SOURCE_TREE/src/plugins
for(dir, QTC_PLUGIN_DIRS) {
INCLUDEPATH += $$dir
}
# 至少包含src/libs目录
QTC_LIB_DIRS += $$IDE_SOURCE_TREE/src/libs
for(dir, QTC_LIB_DIRS) {
INCLUDEPATH += $$dir
}
我们现在可以知道,对于每一个使用qtcreator.pri的子项目,都包含
- 源目录/src
- 源目录/src/libs
- 源目录/src/plugins
- 源目录/src/tools
- 构建目录/src
这样包含以后,引用头文件的时候,只需要直接包含"dependproject/xx.h",不用管"../../.."这种模式,把自己搞晕呼了,也容易出错。
链接
# qtcreatorplugin.pri
# 依赖插件也输出到同一个目录,所有链接到该目录,注意是大写-L
LIBS += -L$$DESTDIR
# qtcreator.pri
# 注意是大写-L
LIBS *= -L$$IDE_LIBRARY_PATH
!isEmpty(QTC_PLUGIN_DEPENDS) {
LIBS *= -L$$IDE_PLUGIN_PATH
}
# 注意是小写-l,连接依赖的指定库文件
for(ever) {
LIBS += -l$$qtLibraryName($$QTC_PLUGIN_NAME)
}
for(ever) {
LIBS += -l$$qtLibraryName($$QTC_LIB_NAME)
}
我们现在可以知道,对于每一个使用qtcreator.pri的子项目
- 动态库编译时,LIBS链接路径有两个:IDE_LIBRARY_PATH和IDE_PLUGIN_PATH。
直接解决了libs和plugins目录下的项目的依赖问题。
输出
# qtcreatorplugin.pri
# 注意,还有一个用户路径,这里不展示了
DESTDIR = $$IDE_PLUGIN_PATH
# qtcreatorlibrary.pri
# 输出到两个路径
win32 {
DLLDESTDIR = $$IDE_APP_PATH
}
DESTDIR = $$IDE_LIBRARY_PATH
# qtcreatortool.pri
DESTDIR = $$IDE_LIBEXEC_PATH
我们现在可以知道,
- 插件输出到IDE_PLUGIN_PATH路径
- 库输出到IDE_APP_PATH和IDE_LIBRARY_PATH路径
- 工具输出到IDE_LIBEXEC_PATH路径
构建目录架构
我们结合上一小节,再总结一下输出目录的架构,这也是在qtcreator.pri中指定的。
- 二进制文件路径IDE_BIN_PATH:构建目录/bin
- 可执行程序路径IDE_APP_PATH:构建目录/bin
- 库可执行目录IDE_LIBEXEC_PATH:构建目录/bin
- 数据目录IDE_DATA_PATH:构建目录/share/qtcreator
- 文档目录IDE_DOC_PATH:构建目录/share/doc/qtcreator。
- 库目录IDE_LIBRARY_PATH:构建目录/lib/qtcreator
- 插件目录IDE_PLUGIN_PATH:构建目录/lib/qtcreator/plugins
构建目录如下:

现在我们可知,程序需要的东西至少为:
- 核心bin目录中,包含了程序启动所需要的东西,为可执行程序,库以及工具。
- lib/qtcreator/plugins,为插件目录,程序启动后需要进行解析和加载。
- /share/qtcreator,为数据目录,各种配置文件,模板等,为程序的附属。
正式QtCreator安装目录如下:

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

qt creator源码全方面分析(3-8)的更多相关文章
- qt creator源码全方面分析(3-3)
目录 qtcreatordata.pri 定义stripStaticBase替换函数 设置自定义编译和安装 QMAKE_EXTRA_COMPILERS Adding Compilers 示例1 示例2 ...
- qt creator源码全方面分析(3-5)
目录 qtcreatorlibrary.pri 使用实例 上半部 下半部 结果 qtcreatorlibrary.pri 上一章节,我们介绍了src.pro,这里乘此机会,把src目录下的所有项目文件 ...
- 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 待办事项:应该对此进行扩 ...
随机推荐
- 盒马微信小程序
盒马app刚出现,就吸足了眼球.最近看了看盒马界面,很Q,就想着仿照app写个小程序. 功能介绍 好奇微信小程序是如何制作的,也对盒马app感兴趣,就尝试写了这个盒马小程序.实现了app的部分功能,还 ...
- HTML与CSS 开发常用语义化命名
一.布局❤️ header 头部/页眉:index 首页/索引:logo 标志:nav/sub_nav 导航/子导航:banner 横幅广告:main/content 主体/内容:container/ ...
- vue+express+mysql项目总结(node项目部署阿里云通用)
原文发布于我的个人博客上:原文点这里 前面经历千辛万苦,终于把博客的所有东西都准备好了,现在就只等部署了.下面我介绍下我的部署过程: 一.购买服务器和域名 如果需要域名(不用域名通过ip也可以 ...
- 阿里AI芯片:12nm工艺、709平方毫米大核心
含光出自<列子·汤问>篇有“上古三剑”一章,寓意含而不露,光而不耀,象征含光 800 无形却强劲的算力. 含光 800 是一款 AI 芯片,偏重推理.据介绍,1 颗含光 800 的算力相当 ...
- Simulink仿真入门到精通(八) M语言对Simulink模型的自动化操作及配置
8.1 M语言控制模型的仿真 M语言与Simulink结合的方式: 在Simulink模型或模块中使用回调函数 在M语言中调用与模型相关的命令,控制模型的建立,设置模块的属性,增删信号线,以及运行模型 ...
- 探究Spring Boot中的接收参数问题与客户端发送请求传递数据
结合此篇参考Spring框架学习笔记(9)--API接口设计相关知识及具体编码实现 在使用Spring Boot进行接收参数的时候,发现了许多问题,之前一直都很忙,最近才稍微有空研究一下此问题. 网上 ...
- 【Python】Pyinstall打包不同尺寸ico制作
前言 最近工作之余在学习python,用Pyinstall打包exe的时候发现图标只能在任务栏或者大图的情况下出现,其他情况还是默认图标,,,!!!∑(゚Д゚ノ)ノ 分析 查资料是因为exe在不同情况 ...
- WPF学习概述
引言 在桌面开发领域,虽然在某些领域,基于electron的跨平台方案能够为我们带来某些便利,但是由于WPF技术能够更好的运用Direct3D带来的性能提升.以及海量Windows操作系统和硬件资源的 ...
- 谈谈SQL优化
写SQL是学习数据库必须掌握的非常重要的技能之一.在学习过程当中,我们会尝试写各种各样满足需求的SQL语句.在实际项目中,优秀的SQL语句和普通的SQL语句的执行速度差别非常大.对于一个数据量很大的系 ...
- Git 的简单使用及ssh配置问题-赖大大
软件安装 第一步当然是安装啦. 官方网址:https://git-scm.com/ 具体操作 在你本地电脑的文件夹里右击鼠标,选Git base here 显然,你是在本地仓库的master分支上,通 ...