qt creator原始碼全方面分析(3-8)
阿新 • • 發佈:2020-04-06
[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:構建目錄/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安裝目錄如下:
------
**`原創造福大家,共享改變世界`**
**`獻出一片愛心,溫暖作者心靈`**