cmakecache.txt是持久化缓存配置的文件,缓存变量存于其中、跨构建生效,普通变量仅内存存在、单次运行有效;缓存变量优先级高于普通set(),类型需明确(如bool/path),-d参数或force可覆盖缓存值。

CMakeCache.txt 就是构建配置的“记事本”,不是临时文件,删了它等于重做一次初始配置
缓存变量和普通变量到底差在哪
缓存变量写进 CMakeCache.txt,普通变量只存在内存里。前者跨多次 cmake -B build 依然有效,后者一跑完就消失。你改了 CMakeLists.txt 里的 set(VAR ON),但 VAR 已在缓存里存为 OFF,那这次运行还是 OFF —— 因为缓存变量优先级高于普通 set()。
-
option()和带CACHE的set()都会写入缓存;纯set()不会 - 缓存变量类型必须明确:比如
BOOL、PATH、STRING,否则 GUI 无法正确渲染 -
INTERNAL类型变量也进缓存,但不会出现在cmake-gui或cmake -L列表中
为什么改了 CMakeLists.txt 却没生效
最常见原因:你动了 set(MY_FEATURE ON CACHE BOOL "...") 的默认值,但缓存里已经存了 MY_FEATURE:BOOL=OFF。CMake 加载时直接用缓存值,根本不会看你新写的 ON。
- 命令行
-D参数优先级最高,能覆盖缓存值:cmake -B build -DMY_FEATURE=ON - 想强制刷新所有缓存值,删掉
build/CMakeCache.txt(不用删整个build/) - 用
set(MY_FEATURE ON CACHE BOOL "..." FORCE)也能覆盖,但仅限当前运行,下次仍读缓存
哪些操作会真正修改 CMakeCache.txt
只有三类操作会持久写入该文件:
- 首次运行
cmake -B build时,所有option()和set(... CACHE ...)初始化写入 - 后续运行中通过
cmake-gui或ccmake修改并保存 - 命令行用
-D指定值,比如cmake -B build -DCMAKE_BUILD_TYPE=Debug
注意:unset(VAR CACHE) 会从缓存中移除变量,下次运行又回到默认值;而 unset(VAR)(无 CACHE)只清内存变量,对缓存无影响。
缓存机制本质是优化:避免每次重新探测编译器特性、库路径、系统字节序等耗时操作。但它的“粘性”也意味着——你以为改了配置,其实只是改了代码里的默认值,真正起作用的还是磁盘上那个 CMakeCache.txt 里的旧记录。











