Qt 5.12 Release版本QMessageLogger日志分类编译错误问题
Qt 5.12日志分类Release编译错误解决方案
问题根源
当Release模式下定义QT_NO_DEBUG_OUTPUT时,Qt会将qDebug()宏替换为QMessageLogger::noDebug(),但noDebug()没有接受QLoggingCategory作为参数的重载版本,因此编译时会出现"no matching function"错误。Debug模式下该宏未定义,qDebug()能正常匹配支持日志分类的重载,所以运行正常。
解决方案
方案1:移除QT_NO_DEBUG_OUTPUT,用日志过滤控制输出
这是最符合Qt日志分类设计的方式,通过配置过滤规则替代直接禁用qDebug宏:
- 从Pro文件中删除
DEFINES += QT_NO_DEBUG_OUTPUT - 在main函数中添加Release模式的日志过滤逻辑:
#include <QLoggingCategory> int main(int argc, char *argv[]) { QApplication a(argc, argv); #ifdef NDEBUG // Release模式下关闭所有Debug级输出 QLoggingCategory::setFilterRules("*.debug=false"); // 若需保留特定分类的Debug输出,可改为: // QLoggingCategory::setFilterRules("logInfo.debug=true;*.debug=false"); #endif qDebug(logInfo()) << "Msg Debug"; return a.exec(); }
方案2:保留QT_NO_DEBUG_OUTPUT,添加条件编译屏蔽调用
直接在代码中对带分类的qDebug调用做条件编译,仅在Debug模式下生效:
#ifndef QT_NO_DEBUG_OUTPUT qDebug(logInfo()) << "Msg Debug"; #endif
方案3:自定义宏替换,兼容Release模式的分类调用
如果必须保留QT_NO_DEBUG_OUTPUT又不想屏蔽代码,可以自定义宏替换逻辑:
修改Pro文件的Release配置:
CONFIG(release, debug|release) { DEFINES += NDEBUG // 自定义qDebug宏,仅当分类启用Debug时才输出 DEFINES += "qDebug(category) = if(category().isDebugEnabled()) QMessageLogger(__FILE__, __LINE__, Q_FUNC_INFO, category().categoryName()).debug()" }
此方式会让qDebug(logInfo())在Release模式下仅当logInfo分类的Debug输出启用时才执行,否则无操作,避免编译错误。
内容的提问来源于stack exchange,提问作者GUN_ter
相关产品推荐
相关产品推荐

