【发布时间】:2017-06-28 20:16:45
【问题描述】:
当我在编辑 CMakeLists.txt 后使用 cmake 时,一些变量不会被加载。如果我用 CACHE STRING 定义了一些东西,它不会让我在不强制它或删除缓存的情况下更改它。
那么为什么我们有这个 CMakeCache.txt 文件。还需要吗?
【问题讨论】:
标签: cmake
当我在编辑 CMakeLists.txt 后使用 cmake 时,一些变量不会被加载。如果我用 CACHE STRING 定义了一些东西,它不会让我在不强制它或删除缓存的情况下更改它。
那么为什么我们有这个 CMakeCache.txt 文件。还需要吗?
【问题讨论】:
标签: cmake
是的,当然需要。由于 CMakeList 文件发生更改,或者当您 make rebuild_cache 时,CMake 在构建期间重新运行自身时使用缓存。它还在正常配置运行开始时加载缓存。
使用 CMake 的标准工作流程如下:
ccmake 或类似工具中,检查初始运行设置的缓存变量,并根据需要进行修改。您现在已经根据自己的喜好配置了构建系统。
要使上述内容生效,缓存中的用户更改必须优先于 CMakeLists.txt 中指定的默认缓存值。否则,从第 2 点开始的用户更改将在下次配置时丢失,并再次被项目指定的默认值覆盖。
这就是为什么 CMake 命令 set(var ... CACHE) 不会修改缓存变量 var(如果它已经存在)的原因。通常,您的项目应将设置缓存视为提供用户可调整的默认值。
如果您确实需要覆盖项目中的用户选择,您可以:
FORCE 添加到set 命令,或CACHE 的set 来设置非缓存变量。非缓存变量优先于同名缓存变量。【讨论】:
CMakeLists.txt 的副本,但是对原始文件运行 cmake ......我仍然没有解决为什么我的变量被缓存覆盖。虽然我没有使用set,但我使用了find_library,并且可能缓存了变量?这就解释了为什么在该变量中设置了一个完全不同的库 -> 我复制了现有的 find_library 代码行并编辑了变量名。当我编辑实际的库名称时,重复的名称永远困扰着缓存。 (IDE 确实重新加载了 cmake)。
find_* 调用的结果通常会进入缓存。
激励例子
这基本上是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
【讨论】: