本身很是喜欢 QT 这个框架, 使用 QT 这几年, IDE 一直是使用的 QT 自带的 Qt Creator, 这个 IDE 自己比较轻巧, 同事相关的语法提示之类的也算够用, 可是 qmake 有的时候就显得不那么只能了, 有时非得手动qmake一下才行, 有时须要清除再构建, 有时这二者合一块儿也不必定解决问题. 须要删除构建目录才行. 不少新手学习的时候, 常常会再论坛或群里问, 为何个人代码和书上的如出一辙, 怎么构建时就出错呢? 这种状况, 大可能是 qmake “抽风”了. 其实 QBS 刚出来的时候就想试试, 可是被那个自带文档吓住了. 这个春节, 无心中打开 QBS 的文档, 仔细看了下. 同时实践了下, 原来这个东西仍是很简单的. 鉴于目前网上对 QBS 的中文资料好像一篇都没有, 特地整理了下本身学习过程当中的心得分享出来. 一来可让本身对 QBS 的认识更加系统, 二来也给有须要的人一个参考.linux
QBS 即 Qt Build Suite. 同 qmake, cmake 之类同样, 都是构建工具. QBS 号称是下一代的构建工具(个人理解是上一代是基于 makefile 的构建工具?). 不过我的认为, 至少和 qmake 比, 仍是要好用不少. 首先文档就比qmake好些, 其次 QBS 的可扩展性真的很强大且易于使用.编程
QBS 项目文件使用一种类 QML 语言编写的, 其实就是 QML 的简化版, 对于已经学会 QML 的人理解 QBS 应该会更简单(惋惜我就不会QML). 对了这是一种声明式语言, 对于习惯了命令式编程语言的, 须要转变下思惟, 其实会发现声明式其实更简单.windows
按 QBS 的自带文档, QBS 的知识能够分 3 大块, 即语言项(Language Item), 模块(Module), 以及其它如 QBS 内建提供的服务之类的. 其中最后一块的知识比较简单, 通常查下文档就会用了. 而模块又是由一系列的语言项组成的. 因此最重要的就是语言项了. 语言项和模块的关系就像 C++ 和 库(例如STL, Qt 等的关系). 对于这些预约义的模块, 基本上在用的时候查下模块相应属性的用法便可.markdown
本系列文章, 没有说明 QBS 命令行的用法, 由于我本人是直接使用 Qt Creator 中自带集成的 QBS. 本系列文章, 是面向写 Qt 程序的, 对于平台 Windows 和 Linux 下基本是一致的, 但对于 Mac/IOS, Andorid 的相关语言项是忽略掉的(由于我不会). 还有关于编译 JAVA 语言的语言项也会忽略.app
上面讲到 QBS 的基础是语言项, QBS 文档列出的语言项共有 30 个, 看起来挺多, 可是之后你会知道, 实际使用到的仅有十多个. 下面是我加单的分了下类, 列出了全部的语言项.框架
注: 本篇文章, 只是对 QBS 有个大概的介绍, 无需记住或拼命的理解什么.编程语言
Project
和 SubProject
函数
Project 项在结构上是全部语言项的最顶层的(最外围的)那个语言项, 一个 Project 项包含了一个或多个 Product 项. 同时 Project 项中还能嵌套包含 Project 项.工具
SubProject 项用来将一个 Project 项加入到当前的 Project项中, 将其做为当前项目的一个子项目.学习
Project/SubProject 项做用相似与 qmake 项目文件中(pro文件) 定义 TEMPLATE = subdirs
.
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"
// ...
}
Product 项及其派生的各类项做用相似与定义了 TEMPLATE = app
, TEMPLATE = lib
等的 qmake 项目文件.
FileTagger
, Group
和 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"
}
}
Properties 项则是用来分组属性的. 用法相似于 Group, 只是一个做用于文件, 一个做用于属性.
Depends
, Module
和 Export
Depends 项用来引入功能模块(Module).
Module 项用来定义一个模块, 模块可能包含一系列属性, 规则, 变换等等.
Export 项能够将 Product 中的一系列属性导出, 使得这个 Product 可以像 Module 同样由 Depends 引入使用.
Artifact
, Rule
和 Transformer
Artifact 项, 即工件, 构建过程以及构建最终产生的文件都称之为工件. 工件由规则(Rule) 和 变换 (Transformer)产生.
Rule/Transformer 项, 将输入文件生成一个或多个工件.
其它项: 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个, 我只用到了CppApplication
, DynamicLibrary
和 StaticLibrary
三个. 即便你真的都能用到, 那么它们的用法也是同样的, 换个名字而已.
下一篇文章开始正式开始使用 QBS 来构建项目, 并讲解其中出现的语言项.
转载请加上原文连接, 并保证文章的完整性. 鉴于本身的能力可能有表达失当或者错误的地方, 但愿你们包含. 如您能提出意见或建议, 本人不甚感激.
li_wey AT 163.com