目錄
- 專案檔案作業流程
- 多層目錄模式
- 依賴決議模式
- 包含,鏈接和輸出
- 包含
- 鏈接
- 輸出
- 構建目錄架構
專案檔案作業流程
我們在前面已經討論了所有的專案檔案,
- qtcreator.pro
- qtcreator.pri
- qtcreatordata.pri
- qtcreatorlibrary.pri
- qtcreatorplugin.pri
- 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為例,其決議流程如下:
- 通過TEMPLATE和SUBDIRS模式,加載cppeditor.pro,
- 在pro中加載qtcreatorplugin.pri,
include(../../qtcreatorplugin.pri)
-
在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的值,
-
緊接著在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的子專案,都包含
- 源目錄/src
- 源目錄/src/libs
- 源目錄/src/plugins
- 源目錄/src/tools
- 構建目錄/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的子專案
- 動態庫編譯時,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
我們現在可以知道,
- 插件輸出到IDE_PLUGIN_PATH路徑
- 庫輸出到IDE_APP_PATH和IDE_LIBRARY_PATH路徑
- 工具輸出到IDE_LIBEXEC_PATH路徑
構建目錄架構
我們結合上一小節,再總結一下輸出目錄的架構,這也是在qtcreator.pri中指定的,
- 二進制檔案路徑IDE_BIN_PATH:構建目錄/bin
- 可執行程式路徑IDE_APP_PATH:構建目錄/bin
- 庫可執行目錄IDE_LIBEXEC_PATH:構建目錄/bin
- 資料目錄IDE_DATA_PATH:構建目錄/share/qtcreator
- 檔案目錄IDE_DOC_PATH:構建目錄/share/doc/qtcreator,
- 庫目錄IDE_LIBRARY_PATH:構建目錄/lib/qtcreator
- 插件目錄IDE_PLUGIN_PATH:構建目錄/lib/qtcreator/plugins
構建目錄如下:
現在我們可知,程式需要的東西至少為:
- 核心bin目錄中,包含了程式啟動所需要的東西,為可執行程式,庫以及工具,
- lib/qtcreator/plugins,為插件目錄,程式啟動后需要進行決議和加載,
- /share/qtcreator,為資料目錄,各種組態檔,模板等,為程式的附屬,
正式QtCreator安裝目錄如下:
原創造福大家,共享改變世界
獻出一片愛心,溫暖作者心靈
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/10494.html
標籤:其他
下一篇:今天,我也做開源了
