Qt 快速编译器

Qt 快速编译器允许您在编译时处理 QML 和 JavaScript 代码,而不是在运行时。这允许

  • 更快的应用程序启动
  • 更快地评估绑定和函数

Qt 快速编译器由两个组件组成

注意:qmltcqmlscqmlcachegen是内部构建工具。如果您需要关心它们的调用,那么您要么正在编写一个构建系统,要么您做错了什么。

QML 类型编译器

QML 类型编译器qmltc)将 QML 类型编译成 C++ 类。然后这些 C++ 类将被添加到您的应用程序中,并且可以从其他 C++ 代码中实例化。这样,您可以避免使用 QQmlComponent 来创建您的 QML 类型实例的大多数开销。为了从 qmltc 中受益,您需要修改您的 C++ 代码并使用这些新类。

qmltc 只能编译完全理解其结构的 QML 文档。如果遇到不受支持的语言功能,则将失败。尽管如此,它不必理解绑定和函数中的 JavaScript 代码。

QML 脚本编译器

QML 脚本编译器qmlscqmlcachegen)将绑定和函数编译成高效的字节码和 C++ 函数。如果您使用 qt_add_qml_module 来指定您的 QML 模块,此过程将自动在幕后进行。有关控制 QML 编译不同方面的选项的更多信息,请参阅缓存编译后的 QML 源文件

在编译时,为每个 QML 或 JavaScript 文档创建并构建相应的 C++ 文件。然后 C++ 文件将包含一个 QML 编译单元,由以下内容组成:

  • 对文档结构的有效表示
  • 文档中所有函数和绑定的字节码
  • 编译器完全理解的函数和绑定的 C++ 代码

QML 引擎在运行时不会编译 QML 或 JavaScript 源代码,而是使用预构建的编译单元来更快地加载 QML 组件及其函数和绑定。编译成 C++ 的函数和绑定也可以更快地执行。其他绑定和函数要么直接从字节码解释,要么通过运行时的即时编译 (JIT) 步骤编译成机器码。在编译时,可以执行更复杂的数据类型分析。因此,生成的 C++ 代码通常比 JIT 编译的结果更高效。

可以编译到 C++ 中的 JavaScript 结构有限。更多信息,请参阅 将 JavaScript 编译到 C++ 的限制

如果安装了 Qt Quick 编译器扩展,将使用 qmlsc 而不是 qmlcachegen。它相对于 qmlcachegen 有以下额外功能

  • 它可以在直接模式下编译文档。在这种情况下,将包含直接从其他 QML 组件的支撑类型中包含的 C++ 头文件并直接调用这些类型的方法。相反,在间接模式下,qmlcachegenqmlsc 通过查找机制调用方法,该机制也与解释器和 JIT 一起使用。
  • 它可以在静态模式下编译文档。在这种情况下,qmlsc 假设公开给 C++ 的类型中没有任何属性可以被派生类型所覆盖。这允许编译更多的绑定和函数,但如果某些属性被覆盖,则生成的代码可能无效。

不是生成 C++ 作为输出,qmlscqmlcachegen 还可以生成 .qmlc、.jsc 和 .mjsc "缓存文件"。这些文件仍然包含每个 QML 编译单元,并且可以被 QML 引擎加载以避免重新编译。尽管如此,它们只能包含文档结构和字节码。如果生成缓存文件,则省略将绑定和函数编译到 C++ 的过程。CMake 和 Qt 提供的 qmake 内容管理系统都不公开此功能。

总结

以下表格总结了 qmltcqmlcachegenqmlsc 之间的区别

qmltcqmlcachegenqmlsc
将 QML 类型编译为 C++ 类将 QML 文档编译为 QML 编译单元将 QML 文档编译为 QML 编译单元
生成的输出作为基于 QQmlComponent 的对象创建的更快的替代方案。生成的输出由 QML 引擎内部使用,以避免重新编译,并加快执行速度。生成的输出由 QML 引擎内部使用,以避免重新编译,并加快执行速度。直接模式和静态模式可以进一步加速您的应用程序。
适用于所有版本的 Qt适用于所有版本的 Qt适用于商业客户

© 2024 Qt 公司有限公司。此处包含的文档贡献是各自所有者的版权。本文档以自由软件基金会发布的 GNU 自由文档许可协议版本 1.3 的条款进行许可。Qt 和相关标志是芬兰和/或世界上其他国家的 The Qt 公司有限公司的商标。所有其他商标均为其各自所有者的财产。