Qt 子項目依賴管理:從原理到實踐的最佳分析:depends還是 CONFIG += ordered

1. 問題背景

Qt項目開發中,當一個工程包含多個子項目(如庫、插件、測試模塊)時,如何正確管理它們的構建順序依賴關系

如:
在開發一個包含核心庫(core)、GUI模塊(gui)、插件(plugins)和測試(tests)的Qt項目時,我們發現:
? 如果pluginscore完成構建前啟動編譯,會導致鏈接失敗
? 當tests同時依賴coreplugins時,手動管理順序極易出錯

# 典型構建錯誤示例
ld: cannot find -lcore  # 核心庫尚未編譯完成

2. 為什么需要管理子項目依賴?

在復雜 Qt 項目中,模塊通常存在依賴關系,例如:
? 插件(plugins) 依賴 核心庫(core)
? 測試(tests) 依賴 主程序(app)和庫(lib)

如果構建順序錯誤,可能導致:
? 鏈接失敗(未找到依賴庫)
? 運行時錯誤(插件未正確初始化)
? 維護困難(新增模塊時需手動調整順序)

因此,Qt提供了兩種方式管理依賴,但它們的適用場景不同。
常見的兩種方式:

  1. depends 顯式聲明依賴
  2. CONFIG += ordered 順序構建

但,哪種方式更符合現代 Qt 開發的最佳實踐?


3. depends:顯式依賴聲明(官方推薦)

3.1 基本語法

TEMPLATE = subdirs
SUBDIRS = core gui plugins tests# 顯式聲明依賴
gui.depends = core           # gui 依賴 core
plugins.depends = core gui   # plugins 依賴 core 和 gui
tests.depends = core         # tests 僅依賴 core

3.2 優勢

  1. 精準控制依賴
    ? 明確指定誰依賴誰,避免隱式順序問題。
    ? 支持 非線性依賴(如多個插件依賴同一個庫)。

  2. 可維護性高
    ? 新增模塊時,只需添加 depends,無需調整 SUBDIRS 順序。
    ? 適合大型項目,模塊化清晰。

  3. 官方明確推薦

    “For complex dependencies between subprojects, use the depends variable instead of CONFIG += ordered.”
    —— Qt 6 官方文檔

3.3 適用場景

? 模塊化項目(庫 + 插件 + 測試)。
? 存在交叉依賴(如多個子項目依賴同一個核心模塊)。


4. CONFIG += ordered:順序構建(舊式方案)

4.1 基本語法

TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS = core gui plugins tests  # 嚴格按順序構建:core → gui → plugins → tests

當新增database模塊需要插入到coregui之間時:

  1. 必須手動調整SUBDIRS順序
  2. 可能破壞既有依賴關系
  3. 需要全面回歸測試

4.2 存在問題

  1. 過于死板
    ? 必須確保 SUBDIRS 順序完全匹配依賴關系,否則構建失敗。
    ? 新增模塊時需手動調整順序,容易出錯。

  2. 無法表達復雜依賴
    ? 如果 tests 依賴 core,但 plugins 也依賴 coreordered 無法直接表達。

4.3 殘留用途

? 極簡單的線性依賴項目(如 A → B → C)。
? 歷史遺留代碼維護。


5. 對比分析

特性dependsCONFIG += ordered
依賴表達方式顯式聲明(A.depends = B隱式順序(SUBDIRS 列表順序)
適用項目規模中大型項目極簡單項目
維護成本低(新增模塊只需加依賴)高(需調整順序)
官方推薦度? 推薦?? 不推薦

6. 示例

6.1 現代 Qt 項目推薦寫法

TEMPLATE = subdirs
SUBDIRS = core utils gui plugins tests #(與順序無關)# 顯式聲明依賴
utils.depends = core          # utils 依賴 core
gui.depends = core utils      # gui 依賴 core 和 utils
plugins.depends = gui         # plugins 依賴 gui
tests.depends = core utils    # tests 依賴 core 和 utils

6.2 遺棄用法

TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS = core utils gui plugins tests  # 依賴關系隱含在順序中,難以維護

7. 結論

  1. 優先使用 depends
    ? 它是 Qt 官方推薦的方案,適合絕大多數項目。
    ? 提供更好的可讀性、可維護性和靈活性。

  2. 避免 CONFIG += ordered
    ? 僅用于舊代碼兼容或極其簡單的線性構建。

  3. 保持依賴聲明清晰
    ? 使用注釋分組依賴,例如:

    # Core dependencies
    gui.depends = core
    plugins.depends = core gui
    

提示:在Qt Creator中,右鍵點擊項目 → "Run qmake"可以實時驗證依賴關系是否正確解析。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75392.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75392.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75392.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

業務冪等性技術架構體系-接口冪等

接口冪等 對于冪等的考慮,主要解決兩點前后端交互與服務間交互。這兩點有時都要考慮冪等性的實現。從前端的思路解決 的話,主要有三種:前端防重、PRG模式、Token機制。 前端防重 通過前端防重保證冪等是最簡單的實現方式,前端相關…

AI工具導航大全 | 2025精選版(持續更新)

🚀 AI工具導航大全 | 2025精選版(持續更新) 更新日期:2025-04-11 | 適用場景:學術研究 | 辦公提效 | 創意設計 | 開發編程 數據來源:綜合高校實驗室、企業實踐及開發者社區推薦 🔍 導航目錄 &…

驅動-內核空間和用戶空間數據交換

內核空間與用戶控件數據交換 前面了解的字符設備中對 file_operations 結構體的進行了填充, 該 結構體的每一個成員都對應著一個系統調用, 例如 read、 write 等, 在字符設備相關的文章中有實驗過對 調用函數進行了標志打印, 并沒…

5G_WiFi_CE_DFS

目錄 一、規范要求 1、法規目錄 2、定義 3、運行模式 4、主/從設備相關的運行行為及具體的動態頻率選擇(DFS)要求 5、產品角色確定測試項目 6、測試項目 測試項1:信道可用性檢查(Channel Availability Check) …

Devops之GitOps:什么是Gitops,以及它有什么優勢

GitOps 定義 GitOps 是一種基于版本控制系統(如 Git)的運維實踐,將 Git 作為基礎設施和應用程序的唯一事實來源。通過聲明式配置,系統自動同步 Git 倉庫中的期望狀態到實際運行環境,實現持續交付和自動化運維。其核心…

【藍橋杯】單片機設計與開發,第十二屆

/*頭文件聲明區*/ #include <STC15F2K60S2.H>//單片機寄存器頭文件 #include <init.h>//初始化底層驅動頭文件 #include <led.h>//led,蜂鳴器,繼電器底層驅動頭文件 #include <key.h>//按鍵底層驅動頭文件 #include <seg.h>//數碼管底層驅動頭…

Vue3連接MQTT作為客戶端

先下載依賴 npx --yes --registry https://registry.npmmirror.com npm install mqtt 在src的api創建 mes.js // 導入axios import axios from axios;// 定義一個變量,記錄公共的前綴, baseURL const baseURL http://localhost:8080; const instance axios.create({ base…

主服務器和子服務器之間通過NFS實現文件夾共享

背景&#xff1a; 子服務器想做一個備份服務器 但是之前有很多文件是上傳到本地的&#xff0c;于是服務要從本地讀取文件 但是在不在同一臺服務器中&#xff0c;讀取就會有問題&#xff0c;想 實現在兩者之間創建一個共享文件夾 一 NFS掛載步驟&#xff1a; 在主服務器&#…

LeetCode算法題(Go語言實現)_39

題目 給定一個二叉樹的根節點 root&#xff0c;想象自己站在它的右側&#xff0c;按照從頂部到底部的順序&#xff0c;返回從右側所能看到的節點值。 一、代碼實現 type TreeNode struct {Val intLeft *TreeNodeRight *TreeNode }func rightSideView(root *TreeNode) []int {i…

【AI提示詞】長期主義助手提供規劃支持

提示說明 長期主義是一種關注長期利益和持續學習的思維模式&#xff0c;幫助個人和組織在快速變化的環境中保持耐心和系統性思考。 提示詞 # Role: Long-termist Assistant## Profile - language: 中文 - description: 長期主義是一種關注長期利益和持續學習的思維模式&…

數組 array

1、數組定義 是一種用于存儲多個相同類型數據的存儲模型。 2、數組格式 &#xff08;1&#xff09;數據類型[ ] 變量名&#xff08;比較常見這種格式&#xff09; 例如&#xff1a; int [ ] arr0&#xff0c;定義了一個int類型的數組&#xff0c;數組名是arr0&#xff1b; &am…

基于JavaAPIforKml實現Kml 2.2版本的全量解析實踐-以兩步路網站為例

目錄 前言 一、關于兩步路網站 1、相關功能 2、數據結構介紹 二、JAK的集成與實現 1、JAK類圖簡介 2、解析最外層數據 3、解析擴展元數據和樣式 4、遞歸循環解析Feature 5、解析具體的數據 三、結論 前言 隨著地理信息技術的快速發展&#xff0c;地理空間數據的共享…

腦科學與人工智能的交叉:未來智能科技的前沿與機遇

引言 隨著科技的迅猛發展&#xff0c;腦科學與人工智能&#xff08;AI&#xff09;這兩個看似獨立的領域正在發生深刻的交匯。腦機接口、神經網絡模型、智能機器人等前沿技術&#xff0c;正帶來一場跨學科的革命。這種結合不僅推動了科技進步&#xff0c;也在醫療、教育、娛樂等…

3.1.3.2 Spring Boot使用Servlet組件

在Spring Boot應用中使用Servlet組件&#xff0c;可以通過注解和配置類兩種方式注冊Servlet。首先&#xff0c;通過WebServlet注解直接在Servlet類上定義URL模式&#xff0c;Spring Boot會自動注冊該Servlet。其次&#xff0c;通過創建配置類&#xff0c;使用ServletRegistrati…

《AI大模型應知應會100篇》第10篇:大模型的涌現能力:為什么規模如此重要

第10篇&#xff1a;大模型的涌現能力&#xff1a;為什么規模如此重要 摘要 在人工智能領域&#xff0c;“規模"始終是大模型發展的核心關鍵詞。隨著參數量從百萬級躍升至萬億級&#xff0c;大模型展現出令人驚嘆的"涌現能力”&#xff1a;這些能力在小模型中幾乎不可…

安寶特案例 | Fundació Puigvert 醫院應用AR技術開創尿石癥治療新紀元

案例介紹 在醫療科技不斷進步的今天&#xff0c;Fundaci Puigvert 醫院邁出了重要一步&#xff0c;成功應用AR技術進行了全球首例同時使用兩臺內窺鏡的ECIRS手術&#xff08;內鏡腎內聯合手術&#xff09;&#xff0c;由Esteban Emiliani M.D. PhD F.E.B.U 博士主刀。這標志著…

從數據海洋中“淘金”——數據挖掘的魔法與實踐

從數據海洋中“淘金”——數據挖掘的魔法與實踐 在這個數據飛速膨脹的時代&#xff0c;每天產生的數據量可以用“天文數字”來形容。如果將數據比作金礦&#xff0c;那么數據挖掘&#xff08;Data Mining&#xff09;就是在數據的海洋中挖掘黃金的技術。作為一門結合統計學、機…

kotlin的takeIf使用

takeIf用于判斷指定對象是否滿足條件&#xff0c;滿足就返回該對象自身&#xff0c;不滿足返回null。因為可以返回對象自身&#xff0c;所以可以用作鏈式調用&#xff0c;以簡化代碼&#xff0c;又因takeIf可能返回空&#xff0c;所以常常和let結合使用&#xff0c;示例如下&am…

[定位器]晶藝LA1823,4.5V~100V, 3.5A,替換MP9487,MP9486A,啟燁科技

Features ? 4.5V to 100V Wide Input Range ? 3.5A Typical Peak Current Limit ? Integrated 500mΩ low resistance high side power MOS. ? Constant On Time Control with Constant Switching Frequency. ? 180μA Low Quiescent Current ? 150kHz/240kHz/420kHz Swi…

火山RTC 4 音視頻引擎 IRTCVideo,及 音視頻引擎事件回調接口 IRTCVideoEventHandler

一、IRTCVideo、IRTCVideoEventHandler 音視頻引擎 IRTCVideo&#xff0c;及 音視頻引擎事件回調接口 IRTCVideoEventHandler 負責音視頻管理、創建房間/獲得房間實例 1、創建引擎、及事件回調示例 如&#xff1a; void VideoConfigWidget::initRTCVideo() {m_handler.res…