Qt的moc、uic工具是否支持设置将警告视为错误?
解决方案
工具原生参数配置
Qt的uic、moc工具本身已提供警告转错误的原生参数,配置后工具遇到警告时会返回非0退出码,直接中断构建流程:
- uic(Qt 5.13及以上版本支持):添加
--warnings-as-errors参数
调用示例:uic --warnings-as-errors foo.ui -o ui_foo.h - moc(Qt 5.15及以上版本支持):添加
--warnings-as-errors参数
调用示例:moc --warnings-as-errors baz.h -o moc_baz.cpp
注意:示例中出现的
No relevant classes found. No output generated.属于通知级别的信息,默认不算警告,不会被上述参数拦截,如果需要连这类信息也触发构建中断,可以参考下方低版本兼容方案自定义过滤规则。
构建系统集成配置
如果是用QMake或者CMake管理项目,可以直接在配置文件中全局添加参数,无需修改单独的调用命令:
QMake配置
在项目的.pro文件中添加以下两行:
QMAKE_UICFLAGS += --warnings-as-errors QMAKE_MOCFLAGS += --warnings-as-errors
CMake配置
在项目的CMakeLists.txt中添加以下配置:
# uic全局配置 set(CMAKE_AUTOUIC_OPTIONS --warnings-as-errors) # moc全局配置 set(CMAKE_AUTOMOC_MOC_OPTIONS --warnings-as-errors)
低版本Qt兼容方案
如果使用的Qt版本低于上述支持原生参数的版本,可以通过构建脚本捕获工具输出、自定义过滤关键字的方式实现警告拦截,示例shell脚本片段如下:
# 拦截uic警告 uic foo.ui -o ui_foo.h 2>&1 | tee temp_uic_log if grep -qE "Warning:|Note:" temp_uic_log; then echo "uic输出违规信息,构建中断" rm temp_uic_log exit 1 fi rm temp_uic_log # 拦截moc警告 moc baz.h -o moc_baz.cpp 2>&1 | tee temp_moc_log if grep -qE "Warning:|Note:" temp_moc_log; then echo "moc输出违规信息,构建中断" rm temp_moc_log exit 1 fi rm temp_moc_log
上述规则默认同时拦截Warning和Note级别的信息,如果不需要拦截Note,删除过滤规则中的
|Note:即可。
内容的提问来源于stack exchange,提问作者Parker Coates
相关产品推荐
相关产品推荐

