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

目录

  • 项目文件工作流程

    • 多层目录模式
    • 依赖解析模式
    • 包含,链接和输出
      • 包含
      • 链接
      • 输出
    • 构建目录架构

项目文件工作流程

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

  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)

原文地址:https://www.cnblogs.com/codeForFamily/p/qt-creator-ide-source-learn-3-8.html

时间: 2024-07-29 00:24:44

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

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

目录 The Plugin Manager, the Object Pool, and Registered Objects 插件管理器 对象池和已注册对象 The Plugin Manager, the Object Pool, and Registered Objects 通常,插件不需要直接访问插件管理器. 交互主要间接的通过ExtensionSystem::IPlugin接口. 在某些情况下,则必须使用插件管理器API. 插件需要访问插件管理器的对象池,以扩展Qt Creator的某些方

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

目录 Extending Qt Creator Manual 生成领域特定的代码和模板 代码片段 文件和项目模板 自定义向导 支持其他文件类型 MIME类型 高亮和缩进 自定义文本编辑器 其他自定义编辑器 运行外部工具 简单的外部工具 复杂的外部工具 所有主题 Extending Qt Creator Manual Qt Creator是为Qt开发人员的需求量身定制的跨平台集成开发环境(IDE). Qt Creator可以通过多种方式扩展. 例如,Qt Creator架构基于插件加载器,这意味着

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

目录 Creating Plugins Creating Plugins Qt Creator的核心是一个插件加载程序,加载并运行一组插件,实际上是这些插件提供了您从Qt Creator IDE中了解的功能.甚至应用程序主窗口和菜单都由插件提供的.插件使用不同的方式,供其他插件访问本插件的功能,并允许它们扩展应用程序的某些方面. 例如,Core插件是Qt Creator完全运行所必须具备的非常基本的插件,它提供了主窗口,以及相关API,用于添加菜单项,模式,编辑器类型,导航面板和许多其他内容.

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

目录 qtcreatorplugin.pri 使用实例 上半部 下半部 结果 qtcreatorplugin.pri 上一节我们介绍了qtcreatorlibrary.pri,现在我们介绍qtcreatorplugin.pri,其实插件的本质也是动态库,所以qtcreatorplugin.pri实现的内容和功能与qtcreatorlibrary.pri差不多. 使用实例 和上一节一样,为了分析这个文件,我们也再找个使用该pri的例子,源目录\src\plugins\cppeditor\cpped

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

前置基础介绍 在继续我们的源码学习之前,我们在这里花费一章节来学习一些基础的编码范式. 这些编码范式在后面的几乎所有的源码中都会用到.因此,在这里提前进行介绍. 一方面,有助于理解源码,另一方面,也可以用到自己的日常编码中. 原创造福大家,共享改变世界 献出一片爱心,温暖作者心灵 qt creator源码全方面分析(4) 原文地址:https://www.cnblogs.com/codeForFamily/p/qt-creator-ide-source-learn-4.html

qt creator源码全方面分析(2)

目录 doc文件夹 帮助文档 qdoc工具 doxygen工具 配置文件 qtcreator-project.qdocconf qtcreator-developer.qdocconf doc文件夹 对于bin和dist文件夹这里就不做过多的介绍了.我们首先来重点关注doc文件夹.对于理解源码,帮助文档总是能起到非常有效的作用.其实,我们在第一章<目录介绍>中已经对doc文件夹进行了一个大概的介绍. 帮助文档 帮助文档的来源有两个组成部分: 源代码中的注释 qdoc文件 两者都采用一定约束规范

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

目录 External Tool Specification Files 文件名 位置 文件格式 主要标签 描述标签 可执行规范标签 示例 External Tool Specification Files 外部工具规范文件描述了可以从工具>外部菜单运行的工具. 它指定工具的名称,要运行的可执行文件,可选参数以及如何处理工具的输出. 文件名 <yourtoolname>.xml 位置 用户指定工具位于Mac和Linux上的$HOME/.config/QtProject/qtcreator

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

目录 Common Extension Tasks Common Extension Tasks 本节总结了可用于将UI组件添加到Qt Creator的API函数. 任务 详细 API 添加菜单或菜单项 你可以扩展现有菜单或者创建一个新的菜单 Core::ActionManager, Core::Command 添加可配置的键盘快捷方式 注册快捷方式,使用户可以在通用快捷方式设置对话框中对其进行配置 Core::ActionManager, Core::Command 添加一个模式 模式对应于完

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

目录 Creating Your First Plugin 创建一个插件项目 构建并运行插件 文件结构 qmake项目 插件元数据模板 插件类 头文件 源文件 Creating Your First Plugin 本节介绍,如何使用Qt Creator提供的插件模板,来创建Qt Creator插件,并获取对插件的组成和结构的第一印象. 创建一个插件项目 Qt Creator附带了一个创建Qt Creator插件的向导,该向导会为您创建一个可运行的最小插件.我们强烈建议您使用两个不同的Qt Cre