CMake_message,set,list的用法

格式

Message(模式+“${自定义/系统变量} hello world” …)
其中空格也可以用 ,我会比较习惯用空格

普通模式

模式默认空,放着不写就行

特殊模式

STATUS
输出状态信息
WARNING
当用户错误运行时的错误信息
AUTHOR_WARNING
开发的时候当日志来用
SEND_ERROR
发送一个错误信息,但是不终止
FATAL_ERROR
发送一个错误信息,并且终止

STATUS

[Pasted image 20240107130937.png]
[Pasted image 20240107130801.png]
可以看到前面多加了两个 - 和下面的配置和生成构建文件消息提示是一样的状态信息

WARNING

[Pasted image 20240107131729.png]
[Pasted image 20240107131707.png]
此消息会提示报错行:104 行
报错信息是:HELLO WORLD

AUTHOR_WARNING

[Pasted image 20240107140201.png]
[Pasted image 20240107140220.png]
和 WARNING 不同的是多了一行只能由开发者去解决的报错提示 此警告适用于项目开发人员。 使用 -Wno-dev 来抑制它。

SEND_ERROR

[Pasted image 20240107132328.png]
[Pasted image 20240107142211.png]
和上面的 WARNING 的差别在于输出的报错信息是和 WARNING 相似的但是下面的配置,生成,构建均不成功

FATAL_ERROR

[Pasted image 20240107141333.png]
[Pasted image 20240107141837.png]
和 SEND_ERROR 类似,但是会直接终止下面的构建,可以看到本一个出现的分割线没有输出了

以上是各个模式下出现的情况

变量

变量有分为用户定义的变量和我们 CMake 定义好的变量
输出的形式是 Message(模式+“${自定义/系统变量} …)

系统自带的变量

  1. 项目信息

    • CMAKE_PROJECT_NAME: 当前项目的名称。
    • PROJECT_SOURCE_DIR / CMAKE_SOURCE_DIR: 顶层源代码目录。
    • PROJECT_BINARY_DIR / CMAKE_BINARY_DIR: 顶层二进制或编译目录。
  2. 编译器和工具设置

    • CMAKE_C_COMPILER: C编译器的全路径。
    • CMAKE_CXX_COMPILER: C++编译器的全路径。
    • CMAKE_COMPILER_IS_GNUCC: 如果是GNU的C编译器则为真。
    • CMAKE_COMPILER_IS_GNUCXX: 如果是GNU的C++编译器则为真。
  3. 编译标志

    • CMAKE_C_FLAGS: C编译器的命令行选项。
    • CMAKE_CXX_FLAGS: C++编译器的命令行选项。
  4. 构建类型

    • CMAKE_BUILD_TYPE: 当前的构建类型,如Release或Debug。
  5. 安装路径

    • CMAKE_INSTALL_PREFIX: 安装目录的前缀。
  6. 系统信息

    • CMAKE_SYSTEM: 宿主系统的名称。
    • CMAKE_SYSTEM_NAME: 不包含版本的宿主系统名称。
    • CMAKE_SYSTEM_PROCESSOR: 目标处理器的名称。
  7. 库和执行文件

    • CMAKE_ARCHIVE_OUTPUT_DIRECTORY: 静态库的输出目录。
    • CMAKE_LIBRARY_OUTPUT_DIRECTORY: 共享库的输出目录。
    • CMAKE_RUNTIME_OUTPUT_DIRECTORY: 可执行文件的输出目录。
  8. 查找到的库和程序

    • CMAKE_PREFIX_PATH: 系统查找包(libraries/packages)的路径。
    • CMAKE_INCLUDE_PATH: 系统头文件查找路径。
    • 变量例如Boost_FOUNDBoost_INCLUDE_DIRSBoost_LIBRARIES等,通过find_package(Boost)自动生成。
  9. 版本信息

    • CMAKE_MAJOR_VERSION, CMAKE_MINOR_VERSION, CMAKE_PATCH_VERSION: 分别代表 CMake 的主版本、次版本和补丁级别版本号。

用户定义变量

我们需要通过 set(变量名 “变量值”)
例如
[Pasted image 20240107143812.png]
[Pasted image 20240107143829.png]
要注意的是如果用户定义的变量和系统的变量是同名的那么就会覆盖,作用的范围仅仅是当前的文件目录下

设置带空格的变量

[Pasted image 20240107155414.png]
[Pasted image 20240107155430.png]

设置环境变量

[Pasted image 20240107160219.png]

通过以上就大致了解了 message 的格式对应的含义

输出文本方式

message([[ ]])message(" ") 以及直接使用 message( ) 均可以输出文本,区别是 [[]] 不会展开变量不会对其中诸如${A}的形式进行解析,而 "" 是会去解析变量,而直接()是不推荐的,因为容易误导,我认为需要清晰地表达意图那么最好还是使用””
[Pasted image 20240107154416.png]
[Pasted image 20240107154425.png]
[Pasted image 20240107154502.png]
[Pasted image 20240107154448.png]

LIST 创建多个变量(列表)

[Pasted image 20240107155046.png]
[Pasted image 20240107155114.png]
LIST 这个名字可以随便取,只要形式如上就算创建多个变量

关于列表的更多用法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 创建多个变量

message("-------创建多个变量--------")

set(LISTVALUE b2 b3 b4) # 设置变量 LISTVALUE 为 b2 b3 b4

message(${LISTVALUE}) # 打印变量 LISTVALUE 的值



# 添加元素到变量

list(APPEND port p1 p2 p3) # 将 p1 p2 p3 添加到变量 port 中

message(${port}) # 打印 port 变量



# 获取长度

message("-------获取长度--------")

list(LENGTH LISTVALUE len) # 获取 LISTVALUE 的长度并存储到变量 len

message(${len}) # 打印列表长度



# 查找变量并获取索引

list(FIND LISTVALUE b2 index) # 寻找 LISTVALUE 中的 b2 并获取其索引

message(${index}) # 输出找到的索引值



# 删除列表中的元素

list(REMOVE_ITEM port p1) # 从 port 列表中删除元素 p1

message(${port}) # 输出修改后的 port 列表



# 添加数据

message("-------添加数据--------")

list(APPEND LISTVALUE a5) # 向 LISTVALUE 列表中添加元素 a5

message(${LISTVALUE}) # 输出添加 a5 后的 LISTVALUE 列表



# 在特定位置插入数据

list(INSERT LISTVALUE 3 a4) # 在 LISTVALUE 列表的索引 3 位置插入 a4

message(${LISTVALUE}) # 输出插入 a4 后的 LISTVALUE 列表



# 反转列表

list(REVERSE LISTVALUE) # 反转 LISTVALUE 列表

message(${LISTVALUE}) # 输出反转后的 LISTVALUE 列表



# 排序列表

list(SORT LISTVALUE) # 对 LISTVALUE 列表进行排序

message(${LISTVALUE}) # 输出排序后的 LISTVALUE 列表