现代CMake高级教程 - 第 6 章:输出与变量

本文介绍了CMake中message函数的使用,包括打印调试信息、状态信息、警告和错误。message函数的不同选项会影响输出的前缀和构建过程的行为,如STATUS、WARNING、AUTHOR_WARNING、FATAL_ERROR和SEND_ERROR。此外,还强调了设置和打印变量的方法,以及未正确引用变量可能导致的问题和最佳实践。

双笙子佯谬老师的【公开课】现代CMake高级教程课程笔记

第 6 章:输出与变量

在运行 cmake -B build 时,打印字符串(用于调试)

message("Hello world!")
❯ cmake --build build

Hello world!
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/h/Code/lessonCode/CMakeLession/build

message(STATUS “…”) 表示信息类型是状态信息,有 – 前缀

message(STATUS "Hello world!")
❯ cmake --build build

-- Hello world!
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/h/Code/lessonCode/CMakeLession/build

message(WARNING “…”) 表示是警告信息

message(STATUS "Hello world!")
message(WARNING "This is a warning sign!")
❯ cmake --build build

-- Hello world!
CMake Warning at CMakeLists.txt:2 (message):
  This is a warning sign!


-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/h/Code/lessonCode/CMakeLession/build

message(AUTHOR_WARNING “…”) 表示是仅仅给项目作者看的警告信息

message(STATUS "Hello world!")
message(AUTHOR_WARNING "This is a warning sign!")
❯ cmake --build build

-- Hello world!
CMake Warning (dev) at CMakeLists.txt:2 (message):
  This is a warning sign!
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/h/Code/lessonCode/CMakeLession/build

AUTHOR_WARNING 的不同之处:可以通过 -Wno-dev 关闭

message(STATUS "Hello world!")
message(FATAL_ERROR "This is an error message!")
message(STATUS "after error...")
❯ cmake -B build -Wno-dev
-- Hello world!
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/h/Code/lessonCode/CMakeLession/build

message(FATAL_ERROR “…”) 表示是错误信息,会终止 CMake 的运行

❯ cmake --build build
-- Hello world!
CMake Error at CMakeLists.txt:2 (message):
  This is an error message!


-- Configuring incomplete, errors occurred!
See also "/mnt/h/Code/lessonCode/CMakeLession/build/CMakeFiles/CMakeOutput.log".
gmake: *** [Makefile:138: cmake_check_build_system] Error 1

message(SEND_ERROR “…”) 表示是错误信息,但之后的语句仍继续执行

message(STATUS "Hello world!")
message(SEND_ERROR "This is an error message!")
message(STATUS "after error...")
❯ cmake --build build
-- Hello world!
CMake Error at CMakeLists.txt:2 (message):
  This is an error message!


-- after error...
-- Configuring incomplete, errors occurred!
See also "/mnt/h/Code/lessonCode/CMakeLession/build/CMakeFiles/CMakeOutput.log".
gmake: *** [Makefile:138: cmake_check_build_system] Error 1

message 可以用于打印变量

set(myvar "hello world!")
message("myvar is ${myvar}")
❯ cmake --build build
myvar is hello world!
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/h/Code/lessonCode/CMakeLession/build

如果 set 没加引号会怎样?会变成分号分割的列表
set(myvar hello world)
其实等价于:
set(myvar "hello;world")

set(myvar hello world!)
message("myvar is ${myvar}")
❯ cmake --build build
myvar is hello;world!
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/h/Code/lessonCode/CMakeLession/build

如果 message 没加引号会怎样?会把列表里的字符串当成他的关键字

set(myvar FATAL_ERROR hello)
message("${myvar}")
❯ cmake --build build
FATAL_ERROR;hello
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/h/Code/lessonCode/CMakeLession/build

结论:除非确实需要列表,建议始终在你不确定的地方加上引号,例如:

set(sources "main.cpp" "mylib.cpp" "C:/Program Files/a.cpp")
message("${sources}")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值