Cmake中message函数 如何优雅地输出

这篇具有很好参考价值的文章主要介绍了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")常常被用来输出构建过程中的状态信息。以下是一些具体的使用示例:

  1. 输出变量的值:
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变量的值。

  1. 输出配置信息:
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的选项,初始值为ONmessage(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选项的值。

  1. 输出构建目标信息:
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处理过程的情况下才应使用。在大多数情况下,使用WARNINGSEND_ERROR模式可能更合适。文章来源地址https://www.toymoban.com/news/detail-470672.html

到了这里,关于Cmake中message函数 如何优雅地输出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CMake Error at /usr/local/share/cmake-3.24/Modules/FindCUDA.cmake:859 (message): Specify CUDA_TOOL

    从错误日志中可以看到,问题出在CMake无法找到CUDA工具包的根目录。错误消息是: 这意味着CMake需要知道CUDA工具包的安装位置,以便正确配置和构建denseflow。 为了解决这个问题,你需要设置 CUDA_TOOLKIT_ROOT_DIR 环境变量,指向CUDA的安装目录。通常,CUDA安装在 /usr/local/cuda 目录

    2024年02月06日
    浏览(27)
  • 【ORB-SLAM3】CMake Error at CMakeLists.txt:37 (message): OpenCV > 2.4.3 not found.

    ZED2相机配置使用ORB-SLAM3,出现关于opencv的报错 CMake Error at CMakeLists.txt:37 (message): OpenCV 2.4.3 not found. 由于我的opencv是4版本的,而Cmakelist里面第33行找的是find_package(OpenCV 3.0 QUIET)也就是3版本的,所以找不到,因此而报错 将 find_package(OpenCV 3.0 QUIET) 改为 find_package(OpenCV 4.0 QUIET) 即可

    2024年02月07日
    浏览(32)
  • powershell 雅地关闭UDP监听器

    在PowerShell中优雅地关闭UDP监听器意味着你需要一种机制来安全地停止正在运行的 UdpClient 实例。由于 UdpClient 类本身没有提供直接的停止或关闭方法,你需要通过其他方式来实现这一点。通常,这涉及到在监听循环中添加一个检查点,以便在接收到停止信号时能够退出循环。

    2024年02月21日
    浏览(29)
  • Python如何用print函数输出田字格?如何计算十年后的体重?

    Python如何用print函数输出田字格? 在 Python 编程中,使用 print 函数输出田字格是一项常见的任务。田字格是由“田”字形的方格组成的表格,通常用于排版或整理数据。在 Python 中,可以使用循环嵌套和字符串拼接等方法来实现输出田字格的功能。 以下是使用 print 函数输出田

    2024年02月06日
    浏览(46)
  • Linux 更加优雅地运行 JAR 文件,并将日志文件输出到本地目录,并优雅的查看日志文件信息

    方式一:直接运行jar包,最常用的启动jar包命令,特点:当前ssh窗口被锁定,CTRL + C或关闭窗口,将打断程序运行,程序退出 方式二:代表在后台运行 ,CTRL + C后程序不会被终止,关闭SSH客户端连接,将终止程序 使用 nohup 命令将进程放入后台运行,并使用 符号使命令立即返

    2024年02月16日
    浏览(33)
  • Android JNI系列详解之CMake配置库文件的输出目录

    一、前提 阅读上一篇文章Android JNI系列详解之CMake编译工具的使用,里面讲到了需要配置两个文件:CMakeList.txt和build.gradle 二、配置CMake编译工具输出库文件的路径 1.默认的库文件输出路径:app/build/intermediates/cmake/debug/obj 由此可见不便于每次查找,因此我们需要将这个路径配置

    2024年02月10日
    浏览(26)
  • cmake扩展(2)——windows下动态设置输出文件(dll/exe)版本

    windows下设置文件的版本需要通过VERSIONINFO接口,详情参考VERSIONINFO resource。这里我们根据模板做了一定的修改。 FILEVERSION和PRODUCTVERSION为必填项。内容以\\\',\\\'分隔,输出以\\\'.\\\'分隔(如设置为1,1,3,5,则实际输出版本为1.1.3.5)。可以直接是一整个变量,也可以是多个变量以\\\',\\\'隔开。 而

    2024年02月13日
    浏览(28)
  • cmake 函数相关

    目录 cmake函数和宏基础 demo cmake函数和宏的参数处理 cmake函数和宏的基本使用 demo cmake函数和宏使用变量 demo demo cmake函数和宏需要注意的地方 demo cmake函数和宏的参数 demo 使用第二种形式cmake_parse_arguments() demo list demo singleValueKeywords未传入参数 demo cmake_parse_argumen

    2024年02月16日
    浏览(29)
  • cmake常用命令(1)——函数相关

    cmake中的函数与其他语言相似,表示一个命令集,可以被重复调用。形式如下: function:表示函数开始 name:函数名 arg1 ...:表示参数与name用 空格分隔 ,多个参数间用 空格分隔 ,可省略。 commands:表示命令集。 enfunction:表示函数结束。endfunction实际形式为: 其中name可以省

    2024年02月13日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包