由于我在编辑CMakeLists.txt后使用cmake,因此无法加载某些变量。如果我使用CACHE STRING定义了某些内容,则不允许我更改它而不强制它或删除缓存。
那么为什么我们有这个CMakeCache.txt文件。它甚至需要吗?
答案 0 :(得分:14)
是的,当然需要它。当CMake在构建过程中重新运行时,CMake会使用缓存,因为CMakeList文件已更改,或者make rebuild_cache
。它还会在正常配置运行开始时加载缓存。
使用CMake的标准worflow如下:
ccmake
或类似内容中,检查初始运行设置的缓存变量,并根据需要进行修改。您现在可以根据自己的喜好配置构建系统。
要使上述工作正常,缓存中的用户更改必须优先于CMakeLists.txt中指定的默认缓存值。否则,从第2点开始的用户更改将在下次配置时丢失,再次由项目指定的默认值覆盖。
这就是为什么CMake命令set(var ... CACHE)
如果已存在则不修改缓存变量var
的原因。通常,您的项目应该将缓存设置为提供用户可调整的默认值。
如果您确实需要覆盖项目中的用户选择,您可以:
FORCE
添加到set
命令或set
而不使用CACHE
来设置非缓存变量。非缓存变量优先于同名缓存变量。答案 1 :(得分:6)
激励示例
这基本上是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