Qt Quick Compiler

Qt Quick Compiler 可让您在编译时而不是运行时处理 QML 和 JavaScript 代码。这样可以

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

Qt Quick Compiler 由两部分组成:

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

QML 类型编译器

QML 类型编译器 (qmltc)会把 QML 类型编译成 C++ 类。然后,这些 C++ 类将添加到你的应用程序中,并可从其他 C++ 代码中实例化。这样,您就可以避免使用QQmlComponent 创建 QML 类型实例的大量开销。为了受益于qmltc,你需要调整你的 C++ 代码并使用新的类。

qmltc只能在完全理解 QML 结构的情况下编译 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 编译的结果更高效。

哪些 JavaScript 结构可以编译成 C++ 有一些限制。有关这些限制的详细信息,请参阅将 JavaScript 编译为 C++ 时的限制。有关 QML 项目编译效果的统计信息,请参阅获取有关函数和绑定编译的统计信息

如果安装了Qt Quick Compiler Extensions,将使用qmlsc代替qmlcachegen。与qmlcachegen 相比,它具有以下附加功能:

  • 它可以直接模式编译文档。在这种情况下,支持其他 QML 组件的类型的 C++ 头文件会被直接包含,这些类型的方法也会被直接调用。相反,在间接模式(Indirect Mode)下,qmlcachegenqmlsc 会通过查找机制调用方法,这种机制也用于解释器和 JIT。
  • 它可以在静态模式下编译文档。在这种情况下,qmlsc会假定任何暴露于 C++ 的类型的属性都不会被派生类型影射。这允许编译更多绑定和函数,但如果有任何属性被阴影覆盖,则会生成无效代码。

qmlscqmlcachegen也能生成 .qmlc、.jsc 和 .mjsc "缓存文件",而不是生成 C++ 作为输出。这些文件仍各包含一个 QML 编译单元,可由 QML 引擎加载,以避免重新编译。但它们只能包含文档结构和字节码。如果生成了缓存文件,则无需编译绑定和函数到 C++。Qt 提供的 CMake 或 qmake 构建系统都不提供此功能。

总结

下表总结了qmltcqmlcachegenqmlsc 之间的差异:

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

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.