使用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 later。

针对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

将:-DCMAKE_CXX_COMPILER=clazy 添加到cmake命令中。

运行cmake。

选择检查

export CLAZY_CHECKS="qt6-deprecated-api-fixes,qt6-header-fixes,
qt6-qhash-signature,qt6-qlatin1stringchar-to-u,qt6-fwd-fixes,missing-qobject-macro"

启用修复

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>

这将修改源文件,请考虑备份您的代码。

如果修复项之间存在冲突,您将收到通知,并且不会更改任何文件。

并非所有移植都可以通过自动修复项来完成。请仔细查看编译期间关于必须手动更改的代码的警告。

如何在Qt Creator中应用Clazy检查

您可以通过在Qt Creator中选择工具 > 选项 > 分析器(或在macOS上选择Qt Creator > 首选项 > 分析器)在Qt Creator中访问Clazy检查。

您必须创建自己的配置,并在Qt Creator 4.14.1或更高版本中的第2级和手动级别部分选择针对移植定制的Clazy检查。您可以使用qt6过滤器找到大多数检查。请注意,仅选择上述给定列表中存在的检查。

"Filtering Qt 6 checks"

注意:我们建议您取消选择除移植检查以外的所有其他检查,以使应用修复项更容易并避免不必要的冲突。

要运行检查,请选择分析 > Clang-Tidy和Clazy

有关配置和运行Clazy检查的更多信息,请参阅Qt Creator:使用Clang工具

一句提醒

在Qt Creator中,不会警告修复项之间的冲突。如果同一行有多个修复项,在应用修复项时要小心。

一旦应用了修复项,再次运行检查会失败,因为新代码将只能编译与Qt 6兼容。

© 2024 Qt公司有限公司。本文件内包含的文档贡献是各自所有者的版权。本文件内的文档按自由软件基金会发布的GNU免费文档许可协议版本1.3的条款发放。Qt和相应的商标是Qt公司有限公司在芬兰和/或其他国家的商标。所有其他商标均为其各自所有者的财产。