zoukankan      html  css  js  c++  java
  • 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 
        ...
    

    从上往下形成多级目录层次。

    image-20200306194856550

    依赖解析模式

    我们还是以源目录srcpluginscppeditor为例。其解析流程如下:

    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中获取的变量,进行递归依赖解析。

    最终从上往下也形成多级目录层次。

    image-20200306195210402

    源目录srclibs中的各个子项目同上。

    包含,链接和输出

    这里,我们统一分析下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

    构建目录如下:

    image-20200306200355047

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

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

    正式QtCreator安装目录如下:

    image-20200306210421311

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

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


  • 相关阅读:
    TCP/IP协议栈之QEMU
    FreeRTOS-Plus-CLI中添加一个自己的命令行
    FreeRTOS A57
    log日志库
    函数解读:ioremap / ioremap_nocache / ioremap_wc / ioremap_wt
    Makefile 使用小结
    41. 缺失的第一个正数(First Missing Positive)
    42. 接雨水(Trapping Rain Water)
    关于C++内联和静态成员函数的问题
    C++11 线程并发问题
  • 原文地址:https://www.cnblogs.com/codeForFamily/p/qt-creator-ide-source-learn-3-8.html
Copyright © 2011-2022 走看看