Qt Quick Compiler
Qt Quick Compiler 可让您在编译时(而非运行时)处理 QML 和 JavaScript 代码。这使得:
- 应用程序启动更快
- 更快地评估绑定和函数
Qt Quick Compiler 由两个组件构成:
注意: qmltc、qmlsc和qmlcachegen是内部构建工具。如果您需要关注它们的调用方式,要么是您正在编写构建系统,要么就是您的操作有误。
QML 类型编译器
QML 类型编译器 (qmltc)将 QML 类型编译为 C++ 类。这些 C++ 类随后会被添加到您的应用程序中,并可通过其他 C++ 代码进行实例化。通过这种方式,您可以避免使用QQmlComponent 创建 QML 类型实例时产生的大部分开销。 要充分利用qmltc,您需要调整 C++ 代码并使用这些新类。
qmltc仅能在完全理解 QML 文档结构的情况下对其进行编译。若遇到不支持的语言特性,编译将失败。不过,它无需理解绑定和函数中的 JavaScript 代码。
QML 脚本编译器
QML 脚本编译器(qmlsc和qmlcachegen)会将绑定和函数编译为高效的字节码和 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 扩展,将使用qmlsc代替qmlcachegen。与qmlcachegen相比,它具有以下额外功能:
- 它可以在“直接模式”下编译文档。在此模式下,支撑其他 QML 组件的类型的 C++ 头文件会被直接包含,且会直接调用这些类型的方法。相反,在“间接模式”下,qmlcachegen或qmlsc会通过查找机制调用方法,该机制也用于解释器和 JIT。
- 它可以在静态模式下编译文档。在此模式下,qmlsc假定任何暴露给 C++ 的类型的属性都不会被派生类型遮蔽。这允许编译更多的绑定和函数,但如果存在被遮蔽的属性,则会生成无效代码。
除了生成 C++ 输出外,qmlsc和qmlcachegen还可以生成 .qmlc、.jsc 和 .mjsc 格式的“缓存文件”。这些文件仍各自包含一个 QML 编译单元,可由 QML 引擎加载以避免重新编译。 不过,这些文件只能包含文档结构和字节码。如果生成缓存文件,则会省略将绑定和函数编译为 C++ 的过程。Qt 提供的 CMake 和 qmake 构建系统均未提供此功能。
总结
下表总结了qmltc、qmlcachegen和qmlsc 之间的区别:
| qmltc | qmlcachegen | qmlsc |
|---|---|---|
| 将 QML 类型编译为 C++ 类 | 将 QML 文档编译为 QML 编译单元 | 将 QML 文档编译为 QML 编译单元 |
| 生成的输出可作为基于 `QQmlComponent` 的对象创建方式的一种更快的替代方案。 | 生成的输出由 QML 引擎在内部使用,以避免重新编译并加快执行速度。 | QML 引擎在内部使用生成的输出,以避免重新编译并加快执行速度。直接模式和静态模式可进一步加速您的应用程序。 |
| 适用于所有版本的 Qt | 适用于所有版本的 Qt | 适用于商业客户 |
© 2026 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.