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. ProjectSubProject

    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"
        // ... 
    }

    Product 项及其派生的各种项作用类似与定义了 TEMPLATE = app, TEMPLATE = lib 等的 qmake 项目文件.

  3. FileTagger, GroupProperties

    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, 只是一个作用于文件, 一个作用于属性.

  4. Depends, ModuleExport

    Depends 项用来引入功能模块(Module).

    Module 项用来定义一个模块, 模块可能包含一系列属性, 规则, 变换等等.

    Export 项可以将 Product 中的一系列属性导出, 使得这个 Product 能够像 Module 一样由 Depends 引入使用.

  5. Artifact, RuleTransformer

    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个, 我只用到了CppApplication, DynamicLibraryStaticLibrary 三个. 即使你真的都能用到, 那么它们的用法也是一样的, 换个名字而已.

下一篇文章开始正式开始使用 QBS 来构建项目, 并讲解其中出现的语言项.

转载请加上原文链接, 并保证文章的完整性. 鉴于自己的能力可能有表达失当或者错误的地方, 希望大家包含. 如您能提出意见或建议, 本人不甚感激. li_wey AT 163.com

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt是一款跨平台的C++应用程序开发框架,Qt提供了一套完整的工具集合来编译和构建应用程序。下面是一些常见的Qt6源码编译工具集合: 1. C++编译器:Qt6的源码是用C++编写的,因此需要使用C++编译器来将源码编译成可执行的二进制文件。常见的C++编译器有GCC、Clang和MSVC等。 2. qmake:qmake是Qt的默认构建系统工具。它能够根据项目文件(.pro)生成Makefile,并提供了一些便捷的方式来编译、链接和部署应用程序。 3. cmake:cmake是另外一种流行的跨平台构建系统工具Qt6支持使用cmake作为替代qmake的构建工具。cmake可以生成适用于不同操作系统和编译器的构建文件。 4. ninja:ninja是一个快速且轻量级的构建工具,被广泛用于Qt的源码编译。它能够更高效地并行处理编译任务,并生成可执行文件。 5. Qt Creator:Qt Creator是一款集成开发环境(IDE),专门用于Qt应用程序的开发。它集成了Qt的编译工具,并提供了可视化的界面来管理项目、编辑代码和调试应用程序。 6. Qt Installer Framework:如果需要将编译好的Qt应用程序打包成安装包,则可以使用Qt Installer Framework。它提供了一套用于构建安装程序的工具和界面,可以方便地进行应用程序的部署和分发。 以上是一些常见的Qt6源码编译工具集合,根据实际需要和开发环境的要求,可以选择合适的工具来完成Qt应用程序的编译和构建。 ### 回答2: Qt是一款流行的跨平台C++应用程序开发框架,Qt 6 是其最新版本。为了编译Qt 6的源码,我们需要使用一系列的工具集合。 首先,我们需要确保我们的系统上安装了C++编译器。常见的C++编译器有GCC、Clang和MSVC。根据不同的平台和操作系统,我们可以选择适合的编译器。确保编译器安装正确并可以通过命令行调用。 其次,为了构建Qt 6源码,我们需要使用一个建构工具Qt提供了一个名为qmake的构建工具。qmake是一个用于构建Qt工程的工具,它可以自动生成相应的构建脚本(Makefile或其他)来编译和链接我们的代码。在Qt 6中,qmake已经被一个新的构建系统qbs替代,但我们仍然可以使用qmake来编译Qt 6的源码。确保安装了Qt工具包并可以通过命令行调用qmake。 另外,为了成功编译Qt 6源码,我们需要安装一些依赖项。Qt 6有一些核心的依赖项,如OpenGL、DBus和SQLite。我们需要确保这些依赖项已经正确地安装在系统上,并配置好相应的开发环境变量。 最后,Qt提供了一个名为Qt Creator的集成开发环境(IDE),它是一个方便的工具,可以帮助我们管理和编译Qt工程。虽然Qt Creator并不是编译Qt 6源码所必需的,但它提供了许多便利的功能,如代码自动完成、调试工具等。如果我们习惯使用IDE来开发Qt应用程序,建议安装并使用Qt Creator。 总之,编译Qt 6的源码需要使用C++编译器、构建工具(如qmake),确保安装了必要的依赖项,并可以使用Qt Creator作为开发环境。这些工具的正确配置和使用可以帮助我们成功地构建和编译Qt 6应用程序。 ### 回答3: Qt 6 是一个跨平台的应用程序开发框架,它提供了许多工具来帮助开发者编译和构建他们的项目。以下是一些常用的 Qt 6 源码编译工具集合: 1. CMake:Qt 6 的源码使用 CMake 构建系统管理,CMake 是一个跨平台的开源构建工具。使用 CMake,开发者可以配置源码编译过程中的各种参数,包括编译器选项、库依赖项等等。 2. Qt Creator:Qt 6 提供了 Qt Creator 集成开发环境,它是一个功能强大的跨平台 IDE,专为 Qt 应用程序开发而设计。Qt Creator 提供了丰富的源码编辑、调试和构建工具,使开发者能够方便地编译和调试他们的项目。 3. qmake:qmake 是一个用于构建 Qt 项目的命令行工具。在 Qt 6 中,开发者可以使用 qmake 创建项目文件(.pro)来描述项目的构建过程,然后使用 qmake 工具生成相应的构建文件,例如 Makefile 或 Visual Studio 解决方案。通过运行生成的构建文件,开发者可以编译和构建他们的项目。 4. Ninja:Ninja 是一个轻量级的构建系统,能够更快地构建大型项目。Qt 6 提供了对 Ninja 的支持,开发者可以使用 Ninja 替代 Make 构建项目,以提高构建速度。 这些工具提供了便捷的编译和构建环境,使开发者能够轻松地编译和构建 Qt 6 的源码。无论是使用命令行工具还是集成开发环境,开发者都可以根据自己的需求选择适合自己的工具来编译和构建他们的项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值