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
模式可能更合适。