亲宝软件园·资讯

展开

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

codeForFamily 人气:1
[TOC] # 项目文件工作流程 我们在前面已经讨论了所有的项目文件, 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) ``` 3. 在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的值。 4. 紧接着在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:构建目录/sharehttps://img.qb5200.com/download-x/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安装目录如下: ------ **`原创造福大家,共享改变世界`** **`献出一片爱心,温暖作者心灵`** ------

加载全部内容

相关教程
猜你喜欢
用户评论