什么是CMakeCache.txt以及它为什么会覆盖我的变量

one*_*eat 15 cmake

由于我在编辑CMakeLists.txt后使用cmake,因此无法加载某些变量.如果我使用CACHE STRING定义了某些东西,它将不允许我在不强制它或删除缓存的情况下更改它.

那么为什么我们有这个CMakeCache.txt文件.它甚至需要吗?

Rei*_*ica 16

是的,这当然是必要的.CMake在构建过程中重新运行自身时会使用缓存,因为CMakeList文件已更改,或者当您更改时make rebuild_cache.它还会在正常配置运行开始时加载缓存.

使用CMake的标准worflow如下:

  1. 在空二进制目录中运行CMake以生成项目和缓存的初始版本
  2. 在CMake GUI或ccmake类似设备中,检查初始运行设置的缓存变量,并根据需要进行修改.
  3. 重新运行CMake(或者如果你的UI提供了它,只需重新启动它的配置步骤).
  4. 重复步骤2和3,直到您对配置满意为止
  5. 如果您只在3中运行Configure,请运行Generate

您现在可以根据自己的喜好配置构建系统.

为了使上述工作正常,缓存中的用户更改必须优先于CMakeLists.txt中指定的默认缓存值.否则,从第2点开始的用户更改将在下次配置时丢失,再次由项目指定的默认值覆盖.

这就是为什么CMake命令set(var ... CACHE)不会修改缓存变量(var如果它已经存在)的原因.通常,您的项目应该将缓存设置为提供用户可调整的默认值.

如果您确实需要覆盖项目中的用户选择,您可以:

  • 添加FORCEset命令,或
  • 使用set而不CACHE设置非缓存变量.非缓存变量优先于同名缓存变量.


Cir*_*四事件 10

激励的例子

这基本上是/sf/answers/2951221311/提到的,但有一个更明确的例子,使其更容易理解.

考虑这个用例:

git clone project
cd project
# Options ddfined with "option(" in CMakeLists.txt.
cmake -DOPT1=ON -DOPT2=OFF -DOPT3=ON .
make
# Create bugs (edit code).
make
Run Code Online (Sandbox Code Playgroud)

然后,几天后,一个新目录被添加到项目中.

这意味着CMakeLists.txt更改了一个新的add_subdirectory,所以我们必须cmake再次运行来更新我们的make文件.

如果我们没有CMakeCache.txt,我们必须记住并再次输入所有选项:

git pull
cmake -DOPT1=ON -DOPT2=OFF -DOPT3=ON .
make
Run Code Online (Sandbox Code Playgroud)

但由于缓存,我们可以做到:

cmake .
make
Run Code Online (Sandbox Code Playgroud)