因为我在编辑CMakeLists.txt后使用cmake,所以一些变量不会被加载。如果我用CACHE STRING定义了某些内容,它不会让我在不强制它或删除缓存的情况下对其进行更改。什么是CMakeCache.txt及其覆盖我的变量的原因
那么为什么我们有这个CMakeCache.txt文件。它甚至需要吗?
因为我在编辑CMakeLists.txt后使用cmake,所以一些变量不会被加载。如果我用CACHE STRING定义了某些内容,它不会让我在不强制它或删除缓存的情况下对其进行更改。什么是CMakeCache.txt及其覆盖我的变量的原因
那么为什么我们有这个CMakeCache.txt文件。它甚至需要吗?
是的,这当然是需要的。 CMake在构建期间重新运行时使用缓存,因为CMakeList文件已更改,或者当您使用make rebuild_cache
时。它还会在正常配置运行开始时加载缓存。
使用CMake的是如下所述的标准worflow:
ccmake
或类似的初始版本,检查缓存变量由初始运行设置,并根据需要进行修改。你现在有根据自己的口味配置编译系统。
对于上述工作,缓存中的用户更改必须优先于CMakeLists.txt中指定的默认缓存值。否则,在下一次配置时,从点2开始的用户更改将丢失,并重新由项目指定的默认值覆盖。
这就是为什么CMake命令set(var ... CACHE)
不修改高速缓存变量var
(如果它已存在)。通常,您的项目应该将缓存设置为提供用户可调整的默认设置。
如果你真的需要覆盖的用户选择在你的项目,你可以:
FORCE
到set
命令,或set
没有CACHE
设置非缓存变量。非缓存变量优先于相同名称的缓存变量。最后但并非最不重要的一点,[load_cache](https://cmake.org/cmake/help/v3.4/command/load_cache.html?highlight=load_cache)命令加载来自另一个项目的CMake缓存的值。 –
激励例如
这基本上是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
有关详细信息请参阅[设置和使用变量的CMake语法是什么?](https://stackoverflow.com/questions/31037882/whats-the-cmake-syntax-to-set-and-use-variables)。 – Florian