使用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过滤器找到大多数检查。请注意,仅选择上述给定列表中存在的检查。
注意:我们建议您取消选择除移植检查以外的所有其他检查,以使应用修复项更容易并避免不必要的冲突。
要运行检查,请选择分析 > Clang-Tidy和Clazy。
有关配置和运行Clazy检查的更多信息,请参阅Qt Creator:使用Clang工具。
一句提醒
在Qt Creator中,不会警告修复项之间的冲突。如果同一行有多个修复项,在应用修复项时要小心。
一旦应用了修复项,再次运行检查会失败,因为新代码将只能编译与Qt 6兼容。
© 2024 Qt公司有限公司。本文件内包含的文档贡献是各自所有者的版权。本文件内的文档按自由软件基金会发布的GNU免费文档许可协议版本1.3的条款发放。Qt和相应的商标是Qt公司有限公司在芬兰和/或其他国家的商标。所有其他商标均为其各自所有者的财产。