2017-02-10 3535 views
6

因为我在编辑CMakeLists.txt后使用cmake,所以一些变量不会被加载。如果我用CACHE STRING定义了某些内容,它不会让我在不强制它或删除缓存的情况下对其进行更改。什么是CMakeCache.txt及其覆盖我的变量的原因

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

+1

有关详细信息请参阅[设置和使用变量的CMake语法是什么?](https://stackoverflow.com/questions/31037882/whats-the-cmake-syntax-to-set-and-use-variables)。 – Florian

回答

8

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

使用CMake的是如下所述的标准worflow:

  1. 运行cmake在一个空的二进制目录生成项目&缓存
  2. 在CMake的GUI或ccmake或类似的初始版本,检查缓存变量由初始运行设置,并根据需要进行修改。
  3. 重新运行CMake(或者如果你的用户界面提供的话,只是其配置步骤)。
  4. 重复步骤2 & 3,直到你满意的配置
  5. 如果你只在3运行的配置,运行生成

你现在有根据自己的口味配置编译系统。

对于上述工作,缓存中的用户更改必须优先于CMakeLists.txt中指定的默认缓存值。否则,在下一次配置时,从点2开始的用户更改将丢失,并重新由项目指定的默认值覆盖。

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

如果你真的需要覆盖的用户选择在你的项目,你可以:

  • 添加FORCEset命令,或
  • 使用set没有CACHE设置非缓存变量。非缓存变量优先于相同名称的缓存变量。
+0

最后但并非最不重要的一点,[load_cache](https://cmake.org/cmake/help/v3.4/command/load_cache.html?highlight=load_cache)命令加载来自另一个项目的CMake缓存的值。 –

1

激励例如

这基本上是https://stackoverflow.com/a/42160304/895245提到什么,但有一个更明显的例子,使其更容易理解。

考虑这种使用情况:

git clone project 
cd project 
# Options dfined 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