项目文件工作流程

我们在前面已经讨论了所有的项目文件,

  1. qtcreator.pro
  2. qtcreator.pri
  3. qtcreatordata.pri
  4. qtcreatorlibrary.pri
  5. qtcreatorplugin.pri
  6. 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为例。其解析流程如下:

  1. 通过TEMPLATE和SUBDIRS模式,加载cppeditor.pro。
  2. 在pro中加载qtcreatorplugin.pri。
include(../../qtcreatorplugin.pri)
  1. 在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的值。

  2. 紧接着在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的子项目,都包含

  1. 源目录/src
  2. 源目录/src/libs
  3. 源目录/src/plugins
  4. 源目录/src/tools
  5. 构建目录/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的子项目

  1. 动态库编译时,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

我们现在可以知道,

  1. 插件输出到IDE_PLUGIN_PATH路径
  2. 库输出到IDE_APP_PATH和IDE_LIBRARY_PATH路径
  3. 工具输出到IDE_LIBEXEC_PATH路径

构建目录架构

我们结合上一小节,再总结一下输出目录的架构,这也是在qtcreator.pri中指定的。

  1. 二进制文件路径IDE_BIN_PATH:构建目录/bin
  2. 可执行程序路径IDE_APP_PATH:构建目录/bin
  3. 库可执行目录IDE_LIBEXEC_PATH:构建目录/bin
  4. 数据目录IDE_DATA_PATH:构建目录/share/qtcreator
  5. 文档目录IDE_DOC_PATH:构建目录/share/doc/qtcreator。
  6. 库目录IDE_LIBRARY_PATH:构建目录/lib/qtcreator
  7. 插件目录IDE_PLUGIN_PATH:构建目录/lib/qtcreator/plugins

构建目录如下:

现在我们可知,程序需要的东西至少为:

  1. 核心bin目录中,包含了程序启动所需要的东西,为可执行程序,库以及工具。
  2. lib/qtcreator/plugins,为插件目录,程序启动后需要进行解析和加载。
  3. /share/qtcreator,为数据目录,各种配置文件,模板等,为程序的附属。

正式QtCreator安装目录如下:


原创造福大家,共享改变世界

献出一片爱心,温暖作者心灵


qt creator源码全方面分析(3-8)的更多相关文章

  1. qt creator源码全方面分析(3-3)

    目录 qtcreatordata.pri 定义stripStaticBase替换函数 设置自定义编译和安装 QMAKE_EXTRA_COMPILERS Adding Compilers 示例1 示例2 ...

  2. qt creator源码全方面分析(3-5)

    目录 qtcreatorlibrary.pri 使用实例 上半部 下半部 结果 qtcreatorlibrary.pri 上一章节,我们介绍了src.pro,这里乘此机会,把src目录下的所有项目文件 ...

  3. qt creator源码全方面分析(0)

    本人主攻C++和Qt. 上两天刚研究完Qt install framework(IFW)应用程序安装框架. google没发现有正儿八经的官方文档的翻译,我就进行了翻译哈!! 系列文章具体见:http ...

  4. qt creator源码全方面分析(4-0)

    Qt系统 Qt Creator源码是在Qt对象和框架基础下写的,因此,阅读Qt Creator源码,你首先对Qt得有一定的了解. Qt Core Qt Core特征: The Meta-Object ...

  5. qt creator源码全方面分析(4-2)

    目录 global头文件 global.h xx.h global头文件 插件的本质就是动态链接库,对于库,需要导出符号,供用户导入使用.在qt creator的源码中,存在固定的导入导出模式. gl ...

  6. qt creator源码全方面分析(4-5)

    目录 Qt中的字符串 QLatinString 详细介绍 源码 小结 QStringLiteral(str) 详细介绍 源码 小结 Qt中的字符串 Qt中处理字符串最常用的肯定是QString,但是在 ...

  7. qt creator源码全方面分析(4-6)

    目录 Qt插件基础 Qt插件基础 我们知道Qt Creator源码是基于插件架构的,那么我们先来介绍下插件基础知识. 相关内容如下: How to Create Qt Plugins [ - Defi ...

  8. qt creator源码全方面分析(3-2)

    目录 qtcreator.pri 判断重复包含 定义版本信息 VERSION 定义IDE名称 启用C++14 CONFIG 自定义函数 Replace Functions Test Functions ...

  9. qt creator源码全方面分析(2-7)

    目录 Completing Code 补全代码片段 编辑代码片段 添加和编辑片段 删除片段 重置片段 补全Nim代码 Completing Code 在编写代码时,Qt Creator建议使用属性,I ...

  10. qt creator源码全方面分析(2-10-1)

    目录 Getting and Building Qt Creator 获取Qt 获取和构建Qt Creator Getting and Building Qt Creator 待办事项:应该对此进行扩 ...

随机推荐

  1. ubuntu下载eclipse详细步骤

    1.官网下载 Eclipse IDE for Java EE Developers: https://www.eclipse.org/downloads/packages/ 2.安装eclipse将其 ...

  2. Ubuntu系统下环境安装遇到依赖冲突问题

    问题场景:在ubuntu系统下使用docker拉了一个python3.6的镜像,要在该容器中安装vim结果总是报已安装某些依赖的版本不满足要求 解决方法: 1.安装aptitude apt-get i ...

  3. angular -——组件样式修改不成功

    angular组件样式修改不成功! 自己定义的css可以成功 组件的不行 style在模板字符串里 直接没有 class 是显示的 但是样式不生效 加上面 即可,为什么?我也不太清楚.有知道答案的请回 ...

  4. 日常破解--从XCTF的app3题目简单了解安卓备份文件以及sqliteCipher加密数据库

    一.题目来源     题目来源:XCTF app3题目 二.解题过程     1.下载好题目,下载完后发现是.ab后缀名的文件,如下图所示:     2.什么是.ab文件?.ab后缀名的文件是Andr ...

  5. 【字节校招】【实习】【内推】字节跳动春招(校招或实习均可)以及日常实习内推ing

    本人是年前刚刚入职抖音的应届生,职业认证还未来的级更改,但是这些都不重要.重要的是我们不能错过优秀的你~ 字节跳动的相关福利我就不介绍了,技术实习生是400/天,房补是1500/月,三餐免费,下午茶, ...

  6. 设计模式-15命令模式(Command Pattern)

    1.模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使 ...

  7. C++总结之template

    函数模板 我们可以把函数模板当做一种特殊的函数,里面的参数类型可以是任意类型,这样的话我们就可以减少重复定义,从而让这个函数模板自动适应不同的参数类型,也就是说函数可以适应多种类型的参数,例如doub ...

  8. 建议14:灵活使用Arguments

    Javascript支持Arguments机制.Arguments是一个为数组,可以通过数组下标形式获取该集合中传递给函数的参数值.例如:下面函数中,没有指定形参,但在函数体内通过Arguments对 ...

  9. 判断 tableZen 是否有 横向滚动条

    判断 tableZen 是否有 横向滚动条 const outWidth = this.$refs.tableInnerZen.$el.clientWidth ].$el.clientWidth

  10. C/C++、C#、JAVA(二):基本类型和转换操作

    基本类型和转换操作 数据类型 C语言中的基本类型如下. 类型 存储大小 值范围 char 1 字节 -128 到 127 或 0 到 255 unsigned char 1 字节 0 到 255 si ...