Cmake中message函数 如何优雅地输出
message函数说明
在CMake中,message()函数用于向终端输出信息。
message([<mode>] "message text" ...)函数的<mode>参数可以是以下之一:
(none): 等同于STATUS,但不推荐使用。STATUS: 输出的信息会被发送到CMake的状态消息流,这是message()函数的默认模式。在命令行上,这些消息通常会被显示出来,但在图形界面中,它们可能会被重定向到其他地方。WARNING: 输出的信息会被发送到CMake的警告消息流。这些消息会被显示出来,并且会标记为警告。AUTHOR_WARNING: 这是WARNING模式的一种变体,只有在CMAKE_SUPPRESS_DEVELOPER_WARNINGS变量为FALSE时才会产生警告。SEND_ERROR: 输出的信息会被发送到CMake的错误消息流,但不会立即停止CMake的处理过程。FATAL_ERROR: 输出的信息会被发送到CMake的错误消息流,并立即停止CMake的处理过程。
| 参数 | 使用场景 | 底层原理 | 优点 | 缺点 |
|---|---|---|---|---|
(none) | 当你想输出一条普通的状态消息,但不希望给它指定任何特殊的模式时。 | 输出的信息会被发送到CMake的状态消息流。 | 简单易用,不需要指定模式。 | 不推荐使用,因为它的行为可能会在未来的CMake版本中改变。 |
STATUS | 当你想输出一条状态消息,例如进度信息或配置信息时。 | 输出的信息会被发送到CMake的状态消息流。 | 明确表示这是一条状态消息,易于理解。 | 在图形界面中,这些消息可能会被重定向到其他地方,不一定能被用户看到。 |
WARNING | 当你想输出一条警告消息,例如某个选项已被弃用或某个操作可能会失败时。 | 输出的信息会被发送到CMake的警告消息流。 | 明确表示这是一条警告消息,可以引起用户的注意。 | 过多的警告消息可能会让用户感到困扰,忽视真正重要的警告。 |
AUTHOR_WARNING | 当你是项目的开发者,并且你想输出一条只有在开发模式下才会显示的警告消息时。 | 输出的信息会被发送到CMake的警告消息流,但只有在CMAKE_SUPPRESS_DEVELOPER_WARNINGS变量为FALSE时才会产生警告。 | 可以避免在用户模式下显示不必要的警告。 | 如果CMAKE_SUPPRESS_DEVELOPER_WARNINGS变量被设置为TRUE,这些警告会被忽略。 |
SEND_ERROR | 当你遇到一个错误,但你希望CMake继续处理剩下的命令时。 | 输出的信息会被发送到CMake的错误消息流,但不会立即停止CMake的处理过程。 | 可以在发生错误时继续执行CMake的处理过程。 | 由于CMake的处理过程没有立即停止,可能会导致更多的错误。 |
FATAL_ERROR | 当你遇到一个严重的错误,你希望立即停止CMake的处理过程时。 | 输出的信息会被发送到CMake的错误消息流,并立即停止CMake的处理过程。 | 可以在发生严重错误时立即停止CMake的处理过程,防止错误的扩散。 | 一旦使用,CMake的处理过程会立即停止,无法执行任何后续的命令。 |
STATUS
在CMake中,message(STATUS "Your message")常常被用来输出构建过程中的状态信息。以下是一些具体的使用示例:
- 输出变量的值:
set(MY_VARIABLE "Hello, CMake!")
message(STATUS "MY_VARIABLE is: ${MY_VARIABLE}")
在这个例子中,message(STATUS "MY_VARIABLE is: ${MY_VARIABLE}")会输出一条状态消息,内容为"MY_VARIABLE is: Hello, CMake!"。${MY_VARIABLE}是CMake的变量引用语法,它会被替换为MY_VARIABLE变量的值。
- 输出配置信息:
option(USE_MY_LIBRARY "Use my library" ON)
message(STATUS "USE_MY_LIBRARY is set to: ${USE_MY_LIBRARY}")
在这个例子中,option(USE_MY_LIBRARY "Use my library" ON)定义了一个名为USE_MY_LIBRARY的选项,初始值为ON。message(STATUS "USE_MY_LIBRARY is set to: ${USE_MY_LIBRARY}")会输出一条状态消息,内容为"USE_MY_LIBRARY is set to: ON"或"USE_MY_LIBRARY is set to: OFF",取决于USE_MY_LIBRARY选项的值。
- 输出构建目标信息:
add_library(MyLibrary SHARED src/my_library.cpp)
message(STATUS "Added shared library target: MyLibrary")
在这个例子中,add_library(MyLibrary SHARED src/my_library.cpp)添加了一个名为MyLibrary的共享库目标。message(STATUS "Added shared library target: MyLibrary")会输出一条状态消息,内容为"Added shared library target: MyLibrary"。
这些状态消息在命令行上运行CMake时会被显示出来,帮助你了解CMake的处理过程。在图形界面的CMake工具(如CMake GUI或IDE的CMake集成)中,这些消息可能会被显示在专门的输出窗口或日志文件中。
WARNING
在CMake中,message(WARNING "message text")函数用于输出警告消息。这些消息会被发送到CMake的警告消息流,并在终端中显示出来。同时,这些消息会被标记为警告,这意味着它们可能会引起用户的注意,或者在某些情况下,可能会导致构建过程失败。
例如,假设你正在编写一个需要某个库才能正常工作的项目,你可以使用find_package()函数来查找这个库。如果find_package()函数没有找到这个库,你可以使用message(WARNING)函数来输出一个警告消息,告诉用户这个库没有找到:
find_package(SomeLibrary)
if(NOT SomeLibrary_FOUND)message(WARNING "SomeLibrary not found, some features will not be available.")
endif()
在这个例子中,如果CMake在配置过程中没有找到SomeLibrary,它会输出一个警告消息,内容为"SomeLibrary not found, some features will not be available."。这个警告消息会被发送到CMake的警告消息流,并在终端中显示出来,从而让用户知道他们可能需要安装SomeLibrary才能使用所有的功能。
请注意,message(WARNING)函数只是输出警告消息,它不会改变CMake的处理过程。如果你想在发生错误时停止CMake的处理过程,你应该使用message(FATAL_ERROR)函数。
AUTHOR_WARNING
AUTHOR_WARNING模式在CMake中用于输出开发者警告。这种模式的警告只有在CMAKE_SUPPRESS_DEVELOPER_WARNINGS变量为FALSE时才会显示。这个变量默认为FALSE,但如果你在CMakeLists.txt文件中设置了这个变量为TRUE,那么AUTHOR_WARNING模式的警告就不会显示。
这种机制可以用于区分开发者警告和用户警告。例如,如果你是一个库的开发者,你可能希望在开发过程中看到所有的警告,包括开发者警告,但是你的用户可能只关心他们需要知道的警告,不希望看到开发者警告。这时,你就可以在你的CMakeLists.txt文件中使用AUTHOR_WARNING模式来输出开发者警告,然后告诉你的用户设置CMAKE_SUPPRESS_DEVELOPER_WARNINGS变量为TRUE来隐藏这些警告。
以下是一个AUTHOR_WARNING模式的示例:
# 如果某个变量没有被设置,输出一个开发者警告
if(NOT DEFINED MY_VARIABLE)message(AUTHOR_WARNING "MY_VARIABLE is not defined")
endif()
在这个示例中,如果MY_VARIABLE变量没有被设置,CMake会输出一个开发者警告,内容为"MY_VARIABLE is not defined"。如果CMAKE_SUPPRESS_DEVELOPER_WARNINGS变量被设置为TRUE,这个警告就不会显示。
SEND_ERROR
SEND_ERROR模式在message()函数中用于输出错误信息,但不会立即停止CMake的处理过程。这意味着CMake会继续处理剩余的命令,直到遇到一个FATAL_ERROR或者处理完所有命令。然后,CMake会以非零状态退出,表示出现了错误。
以下是一个SEND_ERROR的示例:
if(NOT DEFINED REQUIRED_VARIABLE)message(SEND_ERROR "REQUIRED_VARIABLE is not defined")
endif()
在这个示例中,我们首先检查变量REQUIRED_VARIABLE是否已经定义。如果没有定义,我们就使用message(SEND_ERROR ...)输出一条错误信息。这条错误信息会被发送到CMake的错误消息流,并且CMake的处理过程不会立即停止。相反,CMake会继续处理剩余的命令,直到遇到一个FATAL_ERROR或者处理完所有命令。然后,CMake会以非零状态退出,表示出现了错误。
请注意,虽然SEND_ERROR不会立即停止CMake的处理过程,但它会阻止生成步骤的执行。也就是说,如果CMake在处理过程中遇到了一个SEND_ERROR,那么即使CMake成功处理了所有命令,生成步骤也不会执行。这是因为SEND_ERROR表示了一个严重的问题,需要用户的注意和修复。
FATAL_ERROR
FATAL_ERROR是CMake中message()函数的一种模式,用于输出错误消息并立即停止CMake的处理过程。当CMake遇到一个无法继续的错误时,你可以使用message(FATAL_ERROR "error message")来输出错误消息并停止处理。
例如,假设你正在编写一个需要C++11或更高版本的项目,你可以使用以下代码来检查C++编译器是否支持C++11:
if(NOT CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD LESS 11)message(FATAL_ERROR "This project requires C++11 or higher!")
endif()
在这个例子中,如果CMake检测到C++编译器的标准版本小于11,它会输出错误消息"This project requires C++11 or higher!",并立即停止处理。这意味着CMake不会生成构建系统,也不会执行任何后续的CMake命令。这可以防止在不满足项目要求的情况下尝试构建项目,从而避免可能的构建错误和问题。
请注意,FATAL_ERROR应该谨慎使用,只有在确实需要立即停止CMake处理过程的情况下才应使用。在大多数情况下,使用WARNING或SEND_ERROR模式可能更合适。
相关文章:
Cmake中message函数 如何优雅地输出
message函数说明 在CMake中,message()函数用于向终端输出信息。 message([<mode>] "message text" ...)函数的<mode>参数可以是以下之一: (none): 等同于STATUS,但不推荐使用。STATUS: 输出的信息会被发送到CMake的…...
人工智能基础部分20-生成对抗网络(GAN)的实现应用
大家好,我是微学AI,今天给大家介绍一下人工智能基础部分20-生成对抗网络(GAN)的实现应用。生成对抗网络是一种由深度学习模型构成的神经网络系统,由一个生成器和一个判别器相互博弈来提升模型的能力。本文将从以下几个方面进行阐述࿱…...
JavaScript表单事件(上篇)
目录 一、input: 当表单元素的值发生改变时触发,适用于大多数表单元素。 二、change: 当表单元素的值发生改变且失去焦点时触发,适用于输入框、下拉列表等。 三、submit: 当表单提交时触发,适用于 form 元素。 四、reset: 当表单重置时触…...
vb6 Webview2微软Edge Chromium内核执行JS取网页数据测速
微软Edge Chromium内核执行JS获取网页数据测试 ExcuteScript eval(document.body.innerHTML) from : https://www.163.com 采集的网页HTM字符串占用字节空间1.2MB ExcuteScript回调事件中取得JS执行结果,用时 54 毫秒 其中JSON转字符13.5209毫秒 jSON数据长度: 增…...
编码,Part 1:ASCII、汉字及 Unicode 标准
个人博客 编码的历史由来就懒得介绍了,只需要知道人类处理文本信息是以字符为基本单位,而计算机在最底层只认识 0/1,所以当计算机要为人类存储/呈现字符时,就需要有一个规则,在字符和 0/1 序列之间建立映射关系&#…...
C++ Eigen库矩阵操作
C Eigen库 序号功能例子1赋值Eigen::MatrixXf mat (12,1); \\% mat << 1, 2, 3, 4,5,6,7,8,9,10,11,12;2Inplace操作 \\% resizemat.resize(4, 3); \\% 1 5 9 \\% 2 6 10 \\% 3 7 11 \\% 4 8 123转置 \\% transposeInPlacemat.transposeInPlace(); \\% 1 2 3 4 \\% 5…...
Linux-0.11 boot目录bootsect.s详解
Linux-0.11 boot目录bootsect.s详解 模块简介 bootsect.s是磁盘启动的引导程序,其概括起来就是代码的搬运工,将代码搬到合适的位置。下图是对搬运过程的概括,可以有个印象,后面将详细讲解。 bootsect.s主要做了如下的三件事: 搬…...
django组件552
前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…...
【枚举算法的Java实现及其应用】
文章目录 枚举算法概述枚举算法的实现步骤Java实现枚举算法枚举算法的底层工作原理枚举算法的底层代码讲解枚举算法的实际应用场景枚举算法在场景中解决的问题总结 枚举算法概述 枚举算法是一种通过列举所有可能情况来解决问题的方法。这种算法在解决一些特定类型的问题时非常…...
linux led 驱动
前言 今天是儿童节,挣个奖牌给小孩玩玩。 在 linux 驱动大家庭中,LED 驱动算是个儿童,今天就写写他吧。正好之前写过他的婴儿时期《i.MX6ULL 裸机点亮 LED》,记得那时候他还穿着开裆裤呢,裸鸡嘛。 ioremap() 裸机程…...
平面最近点对(分治算法)
文章目录 平面最近点对(分治算法)Solution流程完整模板代码 平面最近点对(分治算法) 文章首发于我的个人博客:欢迎大佬们来逛逛 平面最近点对(加强版) - 洛谷 给你一些点,求两点之…...
【基于前后端分离的博客系统】Servlet版本
🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一. 项目简介 1. 项目背景 2. 项目用到的技…...
在线Excel绝配:SpreadJS 16.1.1+GcExcel 6.1.1 Crack
前端:SpreadJS 16.1.1 后端: GcExcel 6.1.1 全能 SpreadJS 16.1.1此版本的产品中包含以下功能和增强功能。 添加了各种输入掩码样式选项。 添加了在保护工作表时设置密码以及在取消保护时验证密码的支持。 增强了组合图以将其显示为仪表图。 添加了…...
一个轻量的登录鉴权工具Sa-Token 集成SpringBoot简要步骤
Sa-Token 集成SpringBoot简要步骤 1.1 简单介绍 Sa-Token是一个轻量级Java权限认证框架。 主要解决的问题如下: 登录认证 权限认证 单点登录 OAuth2.0 分布式Session会话 微服务网关鉴权等一系列权限相关问题。 1.2 登录认证 设计思路 对于一些登录之后…...
day 44 完全背包:518. 零钱兑换 II;377. 组合总和 Ⅳ
完全背包:物品可以使用多次 完全背包1. 与01背包区别 518. 零钱兑换 II1. dp数组以及下标名义2. 递归公式3. dp数组如何初始化4. 遍历顺序:不能颠倒两个for循环顺序5. 代码 377. 组合总和 Ⅳ:与零钱兑换类似,但是是求组合数1. dp数组以及下标名义2. 递归…...
K8s in Action 阅读笔记——【5】Services: enabling clients to discover and talk to pods
K8s in Action 阅读笔记——【5】Services: enabling clients to discover and talk to pods 你已了解Pod以及如何通过ReplicaSets等资源部署它们以确保持续运行。虽然某些Pod可以独立完成工作,但现今许多应用程序需要响应外部请求。例如,在微服务的情况…...
牛客网DAY2(编程题)
圣诞节来啦!请用CSS给你的朋友们制作一颗圣诞树吧~这颗圣诞树描述起来是这样的: 1. "topbranch"是圣诞树的上枝叶,该上枝叶仅通过边框属性、左浮动、左外边距即可实现。边框的属性依次是:宽度为100px、是直线、颜色为gr…...
Java经典笔试题—day14
Java经典笔试题—day14 🔎选择题🔎编程题🍭计算日期到天数转换🍭幸运的袋子 🔎结尾 🔎选择题 (1)定义学生、教师和课程的关系模式 S (S#,Sn,Sd,Dc,SA )(其属性分别为学号、姓名、所…...
一个帮助写autoprefixer配置的网站
前端需要用到postcss的工具,用到一个插件叫autoprefixer,这个插件能够给css属性加上前缀,进行一些兼容的工作。 如何安装之类的问题在csdn上搜一下都能找到(注意,vite是包含postcss的,不用在项目中安装pos…...
C语言中的类型转换
C语言中的类型转换 隐式类型转换 整型提升 概念: C语言的整型算术运算总是至少以缺省(默认)整型类型的精度来进行的为了获得这个精度,表达式中字符和短整型操作数在使用之前被转换为普通整型,这种转换成为整型提升 如…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
