Qt 6.3 中的一些 CMake 函数

写在前面 Link to heading

今天心血来潮想写点东西,发现之前挖的各种大坑都没填好…… dbq)

说点什么呢 Link to heading

翻消息记录突然看到下面这条评论:

作者写的挺好的,如果能把下面这个官网上面对这个模块功能描述加进去完美了…

哇) 居然在认真的看我的 Blog,突然有点被感动到。 那么今天就先来聊 Qt 6.3 中的 CMake 函数

1. qt6_add_qml_module Link to heading

先来说说大名鼎鼎(?)的 qt6_add_qml_module

细数近期的 Qt Declarative 库中的 commits 不难发现,Qt 还在给这个本就已经很复杂的函数添加参数:FOLLOW_FOREIGN_VERSIONINGSKIP_TYPE_REGISTRATIONNO_IMPORT_SCANNO_RESOURCE_TARGET_PATHNO_PLUGIN

这都啥玩意? Link to heading

a. FOLLOW_FOREIGN_VERSIONING Link to heading

没用过,也没看懂 Doc 在说什么

b. SKIP_TYPE_REGISTRATION Link to heading

震惊!这个函数居然没有对应官方文档!

根据相关 commit 记载: 如果指定了参数,那么生成出的 qmldir 文件中将不会出现任何 QML 文件中的类型。

意思就是运行时 “我想手动注册自己的类型” (使用 qmlRegister[Anonymous|Singleton]Type<T>(...) 一类的函数)

c. NO_IMPORT_SCAN Link to heading

理论上只适用于静态编译的 Qt (因为 Shared Qt 是支持加载动态链接的插件的(QML 组件高强度依赖 Qt Plugin System),而静态无法进行运行时加载 DLLs)

默认情况下,静态编译的 Qt 会在执行 CMake 时运行 qmlimportscanner 扫描指定目录下所有 qml 文件的 import 列表,从而列出需要进行链接的库 (比如 QtCharts, QtWebEngine, QtPositioning, QtGraphicalEffects),这些库将会以 target_link_libraries 的形式链接到依赖他们的 QML 模块中,从而进行 「另一种形式的运行时加载」(可能会再水一篇说这个?)

加了 NO_IMPORT_SCAN 就不一样了,啥也不干,全靠自己(所以完全有可能在运行时产生 Module .... is not installed. 错误)。

d. NO_RESOURCE_TARGET_PATH Link to heading

是一个偷懒小技巧:仅适用于 Executable Target

一般情况下,假设有一个 QML Module 的 URI 是 mymodule.mooody.me,那么对应的 QML 文件应该位于 Prefix/mymodule/mooody/me/*.qml。 (也就是将 URI 中的 . 替换为目录分隔符),加了此参数后,所有的 QML 文件将会直接被放到 Prefix/ (没有很长一段 URI 了)

Qt 文档说:...which may only be used if the backing target is an executable...

确实如此,在调用 QQmlApplicationEngine::load(const [QUrl|QString] &) 时,不再需要指定过于冗长的 URI 了。

e. NO_PLUGIN Link to heading

前一篇文似乎说过 Backing Target 和 Plugin Target 的区别,此参数会让 Qt “不再” 生成一个 Plugin Target,并且直接链接到 Backing Target

2. QT_ANDROID_ABIS Link to heading

经历了万水千山,从 Qt5 中加入 MultiAbi 到 Qt6 qmake 转 CMake 时万不得已 Drop 掉 MultiAbi

现在多 ABI 支持又回来了(以一种看起来极为 Hacky 的方式……)

不太干净,不想说

3. qt_target_compile_qml_to_cpp Link to heading

qmltc

用法大概就是 qt_target_compile_qml_to_cpp(qmltc_test FILES item.qml) 能将 QML 文件生成为 C++ 类,并从 C++ side 创建和修改

注意:在一月份测试时,QMLTC 生成的类并不能正常操作从 QQmlApplicationEngine (也就是常规方式)初始化的 QML 对象

不过还是蛮好玩的

4. qt_standard_project_setup Link to heading

顾名思义:Qt 标准项目设置

设置啥了? Link to heading

  1. 导入了 GNUInstallDirs (也就是 CMAKE_INSTALL_??DIR
  2. 对非 Windows 亦或 macOS (Linux / Android / iOS / WASM / ……) 设置合理的 RPATH
  3. 设置了 CMAKE_AUTOMOCCMAKE_AUTOUICTRUE

问:怎么没有 CMAKE_AUTORCC? 答:新时代了,快去用 qt_add_resources,别手写 qrc


今天大概就罗嗦这么多,愿天下太平

Seeya :)