【问题标题】:What is CMakeCache.txt and why it overrides my variables什么是 CMakeCache.txt 以及为什么它会覆盖我的变量
【发布时间】:2017-06-28 20:16:45
【问题描述】:

当我在编辑 CMakeLists.txt 后使用 cmake 时,一些变量不会被加载。如果我用 CACHE STRING 定义了一些东西,它不会让我在不强制它或删除缓存的情况下更改它。

那么为什么我们有这个 CMakeCache.txt 文件。还需要吗?

【问题讨论】:

标签: cmake


【解决方案1】:

是的,当然需要。由于 CMakeList 文件发生更改,或者当您 make rebuild_cache 时,CMake 在构建期间重新运行自身时使用缓存。它还在正常配置运行开始时加载缓存。

使用 CMake 的标准工作流程如下:

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

您现在已经根据自己的喜好配置了构建系统。

要使上述内容生效,缓存中的用户更改必须优先于 CMakeLists.txt 中指定的默认缓存值。否则,从第 2 点开始的用户更改将在下次配置时丢失,并再次被项目指定的默认值覆盖。

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

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

  • FORCE 添加到set 命令,或
  • 使用不带CACHEset 来设置非缓存变量。非缓存变量优先于同名缓存变量。

【讨论】:

  • 最后但同样重要的是,load_cache 命令从另一个项目的 CMake 缓存中加载值。
  • @Adam CMake 当然预设了很多变量。 cmets 中没有空间来查看不相关的问题;你想发表你自己的问题吗?如果你愿意,可以给我一个链接。
  • @Angew 非常感谢。虽然,我刚刚意识到我编辑了我为调试错误而制作的CMakeLists.txt 的副本,但是对原始文件运行 cmake ......我仍然没有解决为什么我的变量被缓存覆盖。虽然我没有使用set,但我使用了find_library,并且可能缓存了变量?这就解释了为什么在该变量中设置了一个完全不同的库 -> 我复制了现有的 find_library 代码行并编辑了变量名。当我编辑实际的库名称时,重复的名称永远困扰着缓存。 (IDE 确实重新加载了 cmake)。
  • @Adam 是的,find_* 调用的结果通常会进入缓存。
  • 所以我猜应该有一个不可编辑的系统缓存,如果缓存函数的输入相同,将使用缓存结果。另一个用户可编辑的本地设置将覆盖所有内容。如果我理解 CMakeCache.txt 的重点——速度和用户可编辑的本地设置。
【解决方案2】:

激励例子

这基本上是https://stackoverflow.com/a/42160304/895245 提到的内容,但有一个更明确的示例以使其更易于理解。

考虑这个用例:

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

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

这意味着CMakeLists.txt 被新的add_subdirectory 更改,因此我们必须再次运行cmake 来更新我们的make 文件。

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

git pull
cmake -DOPT1=ON -DOPT2=OFF -DOPT3=ON .
make

但是由于缓存,我们可以这样做:

cmake .
make

【讨论】:

  • 如果我需要相反的情况怎么办?我的意思是,如果我出于某种原因需要用户始终键入所有选项怎么办?
  • 嗨 @m4l490n 抱歉,我不太擅长 CMake,如果 Google 没有解决它,请创建一个新问题并在此处的评论中发布链接。
猜你喜欢
  • 2015-04-05
  • 2019-10-06
  • 2014-11-22
  • 2019-03-03
  • 2011-10-22
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 2021-04-13
相关资源
最近更新 更多