当前位置: 首页 > news >正文

CMake 015:日志级别全解析

CMake 015:日志级别全解析

  • 一、日志级别总览(从高到低)
  • 二、最高危:FATAL 级别 —— 进程直接终止
    • 核心行为
    • 示例代码
    • 执行结果
  • 三、次严重:SEND_ERROR 级别 —— 构建停止,进程继续
    • 核心行为
    • 示例代码
    • 执行结果
  • 四、警告级别:WARNING—— 提示风险,不阻断构建
    • 核心行为
    • 示例代码
    • 执行结果
  • 五、普通提示:NOTICE—— 无格式纯信息输出
    • 核心行为
    • 示例代码
  • 六、用户状态:STATUS—— 带前缀的友好提示
    • 核心行为
    • 示例代码
    • 执行结果
  • 七、详细信息:VERBOSE—— 默认隐藏的扩展日志
    • 核心行为
    • 开启方式
    • 示例代码
  • 八、开发者调试:DEBUG & TRACE—— 底层跟踪专用
    • 核心行为
    • 开启方式
    • 示例代码
  • 九、核心机制:STDOUT 与 STDERR 分流
    • 1️⃣ 标准输出 STDOUT(可重定向到文件)
    • 2️⃣ 标准错误输出 STDERR(控制台默认展示)
  • 十、终极技巧:全量日志重定向到文件
  • 十一、级别速查表(记忆版)
  • 总结

在 CMake 工程化开发中,日志输出是调试、定位问题、感知构建状态的核心手段。CMake 提供了一套从严重错误到跟踪调试的完整日志级别体系,遵循「从高到低」的使用原则,不同级别对应不同行为、输出格式与信息流走向。熟练掌握这套规则,能让你的构建脚本更健壮、问题定位更高效。

本文将从最致命的FATAL开始,逐级拆解每类日志的行为、用法、输出特征,并附上可直接运行的代码示例,最后讲透标准输出 / 标准错误输出的重定向技巧。


一、日志级别总览(从高到低)

CMake 日志优先级从高到低依次为:
FATALERRORWARNINGNOTICESTATUSVERBOSEDEBUGTRACE

越高级别的日志,对构建流程影响越大;越低级别,信息量越细、默认越不显示。


二、最高危:FATAL 级别 —— 进程直接终止

FATAL最高优先级错误,一旦触发,CMake 进程立即退出,后续所有代码完全不执行。

核心行为

  • 打印错误信息

  • 进程直接退出,后续逻辑彻底中断

  • 属于标准错误输出(STDERR)

示例代码

# FATAL 错误:触发后直接退出 message(FATAL_ERROR "test fatal error") # 👇 这行永远不会被执行! message("after fatal error")

执行结果

test fatal error

after fatal error完全不输出,CMake 直接终止。

关键结论:FATAL_ERROR用于不可恢复的致命错误,必须确保在安全场景才启用,测试时务必注释掉。


三、次严重:SEND_ERROR 级别 —— 构建停止,进程继续

SEND_ERROR不会杀死 CMake 进程,脚本会继续往下跑,但项目构建产物完全不生成

核心行为

  • 打印错误信息

  • CMake 进程继续执行

  • 停止生成可执行文件 / 库add_executable/add_library失效)

  • 文件路径 + 行号,便于定位

  • 属于标准错误输出(STDERR)

示例代码

# 触发 ERROR,不退出但不生成项目 message(SEND_ERROR "test send error") # 👇 会继续执行 message("after error") # 👇 项目文件不会生成! add_executable(test_message test_message.cpp)

执行结果

  • 控制台输出错误与行号

  • after error正常打印

  • build目录无任何可执行文件

关键结论:SEND_ERROR适合业务逻辑错误但不必终止脚本的场景,阻止非法构建,但不中断流程。


四、警告级别:WARNING—— 提示风险,不阻断构建

WARNING用于非阻断性警告,不影响生成、不退出,只提醒风险。

核心行为

  • 打印警告信息

  • 带文件路径 + 行号

  • 进程正常执行、项目正常生成

  • 属于标准错误输出(STDERR)

示例代码

message(WARNING "test warning")

执行结果

CMake Warning at xxx/CMakeLists.txt:xx (message): test warning

关键结论:WARNING用于潜在问题提示,不影响正常构建流程。


五、普通提示:NOTICE—— 无格式纯信息输出

NOTICE默认普通提示,与不带任何参数的message("msg")完全等价。

核心行为

  • 纯文本输出

  • 不带路径 / 行号

  • 简洁、通用,适合常规提示

  • 属于标准错误输出(STDERR)

示例代码

message(NOTICE "test notice") message("等同于 notice") # 等价写法

关键结论:NOTICE是最常用的通用日志,无多余格式,适合流程说明。


六、用户状态:STATUS—— 带前缀的友好提示

STATUS用于输出用户关心的构建状态,比NOTICE级别更低,自带前缀标识。

核心行为

  • 输出自带前缀:-- test status

  • 简洁、清晰,适合库编译成功、配置完成等状态

  • 属于标准输出(STDOUT)

示例代码

message(STATUS "test status")

执行结果

-- test status

关键结论:STATUS面向使用者,展示关键状态,不干扰错误信息。


七、详细信息:VERBOSE—— 默认隐藏的扩展日志

VERBOSE用户级详细信息默认不显示,需手动开启日志级别。

核心行为

  • 默认隐藏

  • 自带--前缀

  • 属于标准输出(STDOUT)

  • 适合输出详细配置、路径、依赖等信息

开启方式

cmake-S.-Bbuild --log-level=verbose

示例代码

message(VERBOSE "test verbose")

关键结论:VERBOSE用于需要时才展示的详细信息,避免控制台污染。


八、开发者调试:DEBUG & TRACE—— 底层跟踪专用

DEBUGTRACE开发者级日志,默认不显示,用于深度调试。

核心行为

  • 均自带前缀

  • DEBUG:调试信息

  • TRACE:路径 / 流程跟踪

  • 需指定级别才能显示

开启方式

# 显示 DEBUGcmake-S.-Bbuild --log-level=debug# 显示 TRACE(最详细)cmake-S.-Bbuild --log-level=trace

示例代码

message(DEBUG "test debug") message(TRACE "test trace")

九、核心机制:STDOUT 与 STDERR 分流

CMake 日志严格分为两类信息流:

1️⃣ 标准输出 STDOUT(可重定向到文件)

  • STATUS

  • VERBOSE

  • DEBUG

  • TRACE

2️⃣ 标准错误输出 STDERR(控制台默认展示)

  • FATAL_ERROR

  • SEND_ERROR

  • WARNING

  • NOTICE/ 无参数 message


十、终极技巧:全量日志重定向到文件

在 Windows/Linux 通用,把 ** 所有输出(STDOUT+STDERR)** 写入日志文件:

cmake-S.-Bbuild --log-level=trace>log.txt2>&1
  • > log.txt:重定向 STDOUT

  • 2>&1:把 STDERR 合并到 STDOUT,一起写入文件

打开log.txt,即可看到完整构建日志,便于复盘与排查。


十一、级别速查表(记忆版)

级别行为输出信息流适用场景
FATAL进程退出错误STDERR致命错误
ERROR不生成项目错误 + 行号STDERR阻断构建
WARNING正常构建警告 + 行号STDERR风险提示
NOTICE正常输出纯文本STDERR通用提示
STATUS状态输出--前缀STDOUT用户状态
VERBOSE默认隐藏--前缀STDOUT详细信息
DEBUG默认隐藏前缀STDOUT调试
TRACE默认隐藏前缀STDOUT跟踪

总结

CMake 日志体系层级清晰、行为明确、分流严谨

  • 高级别控制流程,低级别提供信息

  • FATAL/ERROR保障构建安全

  • STATUS/VERBOSE提升用户体验

  • DEBUG/TRACE支撑深度调试

  • 输出重定向让日志可沉淀、可分析

把这套规则用到项目里,你的 CMake 脚本会更规范、更易维护、更易排查问题。

http://www.zskr.cn/news/1509158.html

相关文章:

  • Vue.js从零到精通系列(六):组合式函数与逻辑复用——打造自己的 Hooks 工具箱
  • 2026年济南中职学校大揭秘:究竟哪个教学质量更胜一筹?
  • STM32F103的TIM定时器到底怎么选?从呼吸灯到舵机控制,聊聊通用定时器的那些事儿
  • H5页面跨环境直连微信小程序:微信内+外部浏览器一键唤起方案
  • 华硕笔记本性能优化神器G-Helper:告别臃肿Armoury Crate的终极指南
  • 用Python和NetworkX做《权游》社会网络分析
  • 零基础入局白帽SRC!3个月从零斩获首个漏洞,新手赏金挖洞全攻略
  • 九江市黄金回收白银回收铂金回收彩金回收靠谱门店TOP排行榜及联系方式地址电话+诚信店铺推荐 - 大熊猫898989
  • Matlab电磁场仿真工具:静电/电流/静磁二维建模与可视化分析
  • FlexCAN(FD)的Message Buffer RAM布局全解析:从寄存器位到数据数组的映射关系
  • 你的温控项目精度够吗?深入解析10k热敏电阻的B值选择与温度曲线拟合实战
  • 043、Edge Impulse的异常检测与预测维护
  • 白山市黄金回收白银回收铂金回收彩金回收靠谱门店TOP排行榜及联系方式地址电话+诚信店铺推荐 - 大熊猫898989
  • 从第一性原理理解CUDA:Warp执行与存储层次深度解析
  • 中科大AI课实验二:手写Kmeans、PCA与层次聚类的可运行Python代码集
  • Claude Managed Agents:会话即事件日志的生产级Agent架构
  • Linux下开箱即用的CPU浮点性能测试工具集(含Linpack 11.0.1二进制与MKL集成指南)
  • 桥接模式:数据库驱动与连接管理
  • 机器学习落地12类高频隐蔽错误深度排查指南
  • 百度网盘提取码智能查询工具:10秒解锁所有隐藏资源
  • 弹性护栏服务商家排行榜,选哪家性价比高 - mypinpai
  • 基于客户分群与Offer ROI的可解释推荐系统实战
  • 2026年|学姐亲测:5款好用的论文降AIGC工具,AI率80%降至10%及去AI痕迹技巧 - 降AI实验室
  • 儋州市黄金回收白银回收铂金回收彩金回收靠谱门店TOP排行榜及联系方式地址电话+诚信店铺推荐 - 大熊猫898989
  • 【Springboot毕设全套源码+文档】基于javaweb的乡村健康医疗管理系统的设计与开发(丰富项目+远程调试+讲解+定制)
  • 048、Edge Impulse的联邦学习与边缘更新
  • 别再瞎猜了!用Python的tiktoken库精准计算ChatGPT API的Token消耗(附成本估算脚本)
  • Chrome-Charset:终极网页乱码修复解决方案
  • 包头市黄金回收白银回收铂金回收彩金回收靠谱门店TOP排行榜及联系方式地址电话+诚信店铺推荐 - 大熊猫898989
  • 德阳市黄金回收白银回收铂金回收彩金回收靠谱门店TOP排行榜及联系方式地址电话+诚信店铺推荐 - 大熊猫898989