在 CMake 中,set(<variable> <value>... CACHE <type> <docstring> [FORCE])
语法中的 CACHE
是用于定义和存储全局变量的关键字。这种变量在 CMake 配置期间会被缓存,可以跨多个 CMake 配置调用之间保留其值,而不是每次都重新设置。下面详细说明 CACHE
的作用及其与普通 set
指令的区别:
1. CACHE
的作用
- 缓存变量:添加
CACHE
后,变量会被存储到 CMake 的缓存文件(通常是CMakeCache.txt
)中。即使在 CMake 重新配置项目时,缓存变量的值仍然会被保留,而不会被覆盖。 - 跨目录共享:由于缓存变量具有全局性,可以在所有 CMakeLists.txt 文件中访问,而不受限于变量的定义位置或作用域。
- 用户配置:缓存变量允许用户在 CMake GUI 或命令行中设置选项。用户可以通过命令行设置缓存变量,如
cmake -D<variable>=<value> ..
,这对于配置编译选项、路径等设置非常方便。
2. CACHE
与非 CACHE
变量的区别
-
作用范围:
- 普通变量:作用范围通常局限于当前的 CMakeLists.txt 文件或其子目录(如果用
PARENT_SCOPE
可以传递到父目录)。 - 缓存变量:具有全局作用范围,可以跨目录访问和共享。
- 普通变量:作用范围通常局限于当前的 CMakeLists.txt 文件或其子目录(如果用
-
持久性:
- 普通变量:仅在当前 CMake 配置过程中有效,不会保存到缓存文件中。每次重新配置项目时,变量都会重新初始化。
- 缓存变量:值会保存在缓存文件中,在下一次配置时继续使用之前的值,除非手动删除缓存或使用
FORCE
选项覆盖。
示例
假设在顶层 CMakeLists.txt 中定义了一个变量:
# 普通变量
set(MY_VAR "value")# 缓存变量
set(MY_CACHE_VAR "cached_value" CACHE STRING "This is a cached variable")
MY_VAR
是普通变量,仅在当前配置过程中有效。MY_CACHE_VAR
是缓存变量,在 CMake 重新配置时不会被重新定义(除非使用FORCE
参数强制覆盖)。
FORCE
选项
如果要强制更新缓存变量的值,可以使用 FORCE
选项:
set(MY_CACHE_VAR "new_value" CACHE STRING "This is a cached variable" FORCE)
这样可以在缓存文件中覆盖已经存在的 MY_CACHE_VAR
的值。
总结
使用 CACHE
可以让变量的值在 CMake 配置文件中持久化,并跨文件共享,适用于需要全局配置的选项。