1. 程式人生 > >qt creator原始碼全方面分析(3-8)

qt creator原始碼全方面分析(3-8)

[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安裝目錄如下: ------ **`原創造福大家,共享改變世界`** **`獻出一片愛心,溫暖作者心靈`**