Qt構建工具QBS之零 —— QBS 概覽


本系列文章起因

自己非常喜歡 QT 這個框架, 使用 QT 這幾年, IDE 一直是使用的 QT 自帶的 Qt Creator, 這個 IDE 本身比較輕巧, 同事相關的語法提示之類的也算夠用, 但是 qmake 有的時候就顯得不那么只能了, 有時非得手動qmake一下才行, 有時需要清除再構建, 有時這兩者合一起也不一定解決問題. 需要刪除構建目錄才行. 很多新手學習的時候, 經常會再論壇或群里問, 為什么我的代碼和書上的一模一樣, 怎么構建時就出錯呢? 這種情況, 大多是 qmake “抽風”了. 其實 QBS 剛出來的時候就想試試, 但是被那個自帶文檔嚇住了. 這個春節, 無意中打開 QBS 的文檔, 仔細看了下. 同時實踐了下, 原來這個東西還是很簡單的. 鑒於目前網上對 QBS 的中文資料好像一篇都沒有, 特意整理了下自己學習過程中的心得分享出來. 一來可以讓自己對 QBS 的認識更加系統, 二來也給有需要的人一個參考.

QBS 總體認識

QBS 即 Qt Build Suite. 同 qmake, cmake 之類一樣, 都是構建工具. QBS 號稱是下一代的構建工具(我的理解是上一代是基於 makefile 的構建工具?). 不過個人認為, 至少和 qmake 比, 還是要好用很多. 首先文檔就比qmake好些, 其次 QBS 的可擴展性真的很強大且易於使用.

QBS 項目文件使用一種類 QML 語言編寫的, 其實就是 QML 的簡化版, 對於已經學會 QML 的人理解 QBS 應該會更簡單(可惜我就不會QML). 對了這是一種聲明式語言, 對於習慣了命令式編程語言的, 需要轉變下思維, 其實會發現聲明式其實更簡單.

按 QBS 的自帶文檔, QBS 的知識可以分 3 大塊, 即語言項(Language Item), 模塊(Module), 以及其它如 QBS 內建提供的服務之類的. 其中最后一塊的知識比較簡單, 一般查下文檔就會用了. 而模塊又是由一系列的語言項組成的. 所以最重要的就是語言項了. 語言項和模塊的關系就像 C++ 和 庫(例如STL, Qt 等的關系). 對於這些預定義的模塊, 基本上在用的時候查下模塊相應屬性的用法即可.

本系列文章, 沒有說明 QBS 命令行的用法, 因為我本人是直接使用 Qt Creator 中自帶集成的 QBS. 本系列文章, 是面向寫 Qt 程序的, 對於平台 Windows 和 Linux 下基本是一致的, 但對於 Mac/iOS, Andorid 的相關語言項是忽略掉的(因為我不會). 還有關於編譯 Java 語言的語言項也會忽略.

語言項概述

上面講到 QBS 的基礎是語言項, QBS 文檔列出的語言項共有 30 個, 看起來挺多, 但是以后你會知道, 實際使用到的僅有十多個. 下面是我加單的分了下類, 列出了所有的語言項.

注: 本篇文章, 只是對 QBS 有個大概的介紹, 無需記住或拼命的理解什么.

  1. Project 和 SubProject

    Project 項在結構上是所有語言項的最頂層的(最外圍的)那個語言項, 一個 Project 項包含了一個或多個 Product 項. 同時 Project 項中還能嵌套包含 Project 項.

    SubProject 項用來將一個 Project 項加入到當前的 Project項中, 將其作為當前項目的一個子項目.

    Project/SubProject 項作用類似與 qmake 項目文件中(pro文件) 定義 TEMPLATE = subdirs.

  2. Product

    • Application 
      • CppApplication 
        • QtApplication 
          • QtGuiApplication
      • XPCService 
        • ApplicationExtension
    • DynamicLibrary
    • StaticLibrary
    • JavaClassCollection
    • JavaJarCollection
    • AndroidApk
    • LoadableModule

    一個 Product 項就是在構件過程最終生產的結果, 比如可以是一個: 可執行的應用程序, 動態庫, 或是靜態庫等等. 如上列出所示, 從 Product 項又派生出了 Application, DynamicLibrary, StaticLibrary 等項. 但其本質還是 Product 項, 只是為了使用上更方便, 在 Product 項上預設了一些屬性和依賴. 例如: Application 項, 也可以如下 Product 項來表示

    Product {
        type: "application" // ... }
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4

    Product 項及其派生的各種項作用類似與定義了 TEMPLATE = appTEMPLATE = lib 等的 qmake 項目文件.

  3. FileTaggerGroup 和 Properties

    FileTagger 項用來標記(源)文件的類別, 即標記出哪些文件是 C++ 源碼, 哪些文件是資源文件等等, 有點類似於 Windows 系統上的文件擴展名的作用, 但是比擴展名強大的多.

    Group 項用來分組(源)文件, 比如在 Windows 平台和 Linux 平台上需要包含不同的文件時就可以用 Group 項來分組. 如下:

    Application {
        Group {
            name: "Windows files" condition: targetOS.contains("windows") files: "myclass_win_impl.cpp" } Group { name: "Linux files" condition: targetOS.contains("linux") files: "myclass_linux_impl.cpp" } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    Properties 項則是用來分組屬性的. 用法類似於 Group, 只是一個作用於文件, 一個作用於屬性.

  4. DependsModule 和 Export

    Depends 項用來引入功能模塊(Module).

    Module 項用來定義一個模塊, 模塊可能包含一系列屬性, 規則, 變換等等.

    Export 項可以將 Product 中的一系列屬性導出, 使得這個 Product 能夠像 Module 一樣由 Depends 引入使用.

  5. ArtifactRule 和 Transformer

    Artifact 項, 即工件, 構建過程以及構建最終產生的文件都稱之為工件. 工件由規則(Rule) 和 變換 (Transformer)產生.

    Rule/Transformer 項, 將輸入文件生成一個或多個工件.

  6. 其它項: AutotestRunner, InstallPackage, Probe, PropertyOptions, Scanner

小結

為了對 QBS 對上述語言項更好的理解. 可以用一個 C++ 項目來類比:

Project 和 SubProject 就項就像項目的工程文件一樣, 對於簡單的項目, 比如 Hello World 程序, 就一個源文件, 不要工程文件也是可以的. 但是對於有很多源文件的, 還包含各種資源文件時, 還是有必要通過工程文件來管理的.

Product 項及其派生項, 有點項 main, WinMain, DllMain, 之類的入口函數, 決定了最后生成的是什么東西(控制台程序, windows程序, 動態庫).

FileTagger, Group 和 Properties 項有點項 C/C++ 中哪些用來條件編譯的預處理指令.

Depends, Module 和 Export 有點像引入/定義庫文件.

Artifact, Rule 和 Transformer 則項最后開始編譯程序的編譯命令行, 以及生成的中間文件和最終的程.

為了怕嚇住大家, 再次告訴大家 QBS 雖然很強大, 但是也是很簡單的. 比如上面看到列出那么多語言項, 其實很多功能上是重復/相似的, 可以不用的, 還有很多是用不到的. 比如上面第 2 類中的 Product 系總共有13個, 我只用到了CppApplicationDynamicLibrary 和 StaticLibrary 三個. 即使你真的都能用到, 那么它們的用法也是一樣的, 換個名字而已.

下一篇文章開始正式開始使用 QBS 來構建項目, 並講解其中出現的語言項.

轉載請加上原文鏈接, 並保證文章的完整性. 鑒於自己的能力可能有表達失當或者錯誤的地方, 希望大家包含. 如您能提出意見或建議, 本人不甚感激.li_wey AT 163.com

http://blog.csdn.net/ysu533/article/details/50728815


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM