使用 Clazy 检查将 C++ 应用程序移植到 Qt 6
我们已在 Clazy 框架内实施了一些检查和修复,以帮助您将应用程序从 Qt 5 移植到 Qt 6。用他们自己的话说"Clazy 是一个编译器插件,它允许 clang 理解 Qt 语义。请获取 Clazy(https://invent.kde.org/sdk/clazy) 并继续阅读,以便更顺利地移植到 Qt 6。
Clazy 检查可在编译过程中作为插件运行,也可使用clazy-standalone
通过 JSON 编译数据库运行。修正会在稍后应用,使用clang-apply-replacements
。
专用于 Qt 6 移植的 Clazy 检查
以下检查专门用于简化从 Qt 5 到 Qt 6 的移植。
qt6-deprecated-api-fixes
qt6-header-fixes
qt6-qhash-signature
qt6-fwd-fixes
missing-qobject-macro
这些检查必须在 Qt 5 中运行。修正后的代码只能在 Qt 6 中编译。因此,必须一次性运行上述检查。Clazy 建议一次只运行一个测试,以避免在应用修复时发生冲突。
如何应用 Clazy 检查
如何设置您的项目以便与 Clazy 一起运行,以及如何选择和应用检查,请参阅 https://invent.kde.org/sdk/clazy#setting-up-your-project-to-build-with-clazy。
如果不想以插件形式运行检查,而是通过 JSON 编译数据库,则需要使用clazy-standalone
。有关说明请参见https://invent.kde.org/sdk/clazy#clazy-standalone-and-json-database-support。
简而言之,假设你已经安装了最新版本的 Clazy,下面将介绍如何将检查作为插件运行。
设置项目以便与 Clazy 一起运行。
如果使用 qmake
根据操作系统,在 qmake 命令中添加以下内容:
-spec linux-clang QMAKE_CXX="clazy" -spec macx-clang QMAKE_CXX="clazy"
对于使用 MSVC 的 Windows,添加QMAKE_CXX="clazy-cl.bat"
。
运行 qmake。
如果使用 CMake
在 cmake 命令中添加:-DCMAKE_CXX_COMPILER=clazy
。
运行 cmake。
选择检查:
export CLAZY_CHECKS="qt6-deprecated-api-fixes,qt6-header-fixes, qt6-qhash-signature,qt6-qlatin1stringchar-to-u,qt6-fwd-fixes,missing-qobject-macro"
启用 fixits:
export CLAZY_EXPORT_FIXES=ON
设置 Clazy 忽略的目录:
export CLAZY_IGNORE_DIRS=.*lib_dir.*
这将阻止 Clazy 对库文件进行检查。如果库的路径包含在-I
和-F
中,而不是-isystem
和-framework
中,则有必要这样做。如果触发检查的头文件包含在包含的库文件中,为了避免qt-header-fixes
检查发出警告,也有必要这样做。
编译代码。
在编译过程中,会在源文件旁边创建.yaml
文件。
要应用修复程序,请运行
clang-apply-replacements <path_to_yaml_files>
这将修改源文件,请考虑备份代码。
如果修复程序之间存在冲突,您将收到通知,但不会更改任何文件。
并非所有移植都能使用自动修正程序。请仔细查看编译时的警告,了解哪些代码需要手动修改。
如何在内部应用 Clazy 检查Qt Creator
Qt Creator 您可以通过选择Tools >Options >Analyzer (或 Qt Creator>Preferences >Analyzer 在 macOS 上)。
您必须创建自己的配置并选择专门用于移植的 Clazy 检查,这些检查可在Qt Creator 4.14.1 或更高版本的 Level 2 和 Manual Level 部分找到。您可以使用qt6过滤器找到大部分检查。请注意只选择上述列表中的校验。
注意: 我们建议您取消选择除移植检查之外的所有其他检查,以便更轻松地应用修正程序并避免不必要的冲突。
要运行检查,请选择Analyze >Clang-Tidy and Clazy 。
有关配置和运行 Clazy 检查的更多信息,请参阅Qt Creator: Clang Tools。
注意事项
在Qt Creator 中,fixit 之间的冲突不会被警告。如果同一行中有多个 fixit,在应用这些 fixit 时一定要小心。
一旦应用了修复程序,再次运行检查就会失败,因为新代码只能针对 Qt 6 进行编译。
© 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.