CMakeCache.txt是什么?为什么它会覆盖我的变量

CMakeCache.txt是什么?为什么它会覆盖我的变量,cmake,Cmake,当我在编辑CMakeLists.txt后使用cmake时,一些变量不会被加载。如果我用缓存字符串定义了某个东西,它将不允许我在不强制它或删除缓存的情况下更改它 那么为什么我们有这个cmakcache.txt文件。甚至需要吗?是的,当然需要。CMake在生成过程中由于CMakeList文件已更改而自行运行时,或者当您使rebuild\u缓存时,会使用缓存。它还在正常配置运行开始时加载缓存 使用CMake的标准工作流如下所示: 在空的二进制目录中运行CMake以生成项目的初始版本&cache 在CM

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


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

是的,当然需要。CMake在生成过程中由于CMakeList文件已更改而自行运行时,或者当您
使rebuild\u缓存
时,会使用缓存。它还在正常配置运行开始时加载缓存

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

  • 在空的二进制目录中运行CMake以生成项目的初始版本&cache
  • 在CMake GUI或
    ccmake
    或类似程序中,检查初始运行时设置的缓存变量,并根据需要修改它们
  • 重新运行CMake(或者如果您的UI提供了配置步骤,则只运行其配置步骤)
  • 重复步骤2和3,直到您对配置感到满意
  • 如果您只在3中运行Configure,请运行Generate
  • 现在,您已经根据自己的喜好配置了buildsystem

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

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

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

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

    激励示例

    这基本上就是所提到的,但是有一个更明确的例子使它更容易理解

    考虑这个用例:

    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_子目录
    ,因此我们必须再次运行
    cmake
    来更新make文件

    如果没有
    cmakcache.txt
    ,我们必须记住并再次键入所有选项:

    git pull
    cmake -DOPT1=ON -DOPT2=OFF -DOPT3=ON .
    make
    
    但由于缓存的原因,我们可以只执行以下操作:

    cmake .
    make
    

    有关更多详细信息,请参见。最后但并非最不重要的一点是,该命令从另一个项目的CMake缓存加载值。@Adam CMake当然预设了很多变量。评论中没有空间来讨论无关的问题;你想发表你自己的问题吗?如果你愿意,请给我一个链接。@Angew非常感谢。不过,我刚刚意识到我编辑了一份我为调试错误而制作的
    CMakeLists.txt
    副本,但对原始版本运行了cmake。。。我仍然没有解决为什么我的变量被缓存覆盖。虽然我没有使用
    set
    ,但我使用了
    find\u library
    ,可能变量是缓存的?这解释了为什么在该变量中设置了一个完全不同的库->我复制了一个现有的
    find\u库
    行代码并编辑了变量名。当我编辑实际的库名时,重复的库名永远困扰着缓存。(IDE进行了cmake重新加载)。@Adam是的,
    find.*
    调用的结果通常会进入缓存。因此我想应该有一个不可编辑的系统缓存,如果缓存函数的输入相同,则会使用缓存结果。另一个用户可编辑的本地设置将覆盖所有内容。如果我很好地理解了cmakcache.txt的要点——速度和用户可编辑的本地设置。如果我需要相反的设置呢?我的意思是,如果我出于某种原因需要用户始终键入所有选项,该怎么办?嗨@m4l490n抱歉,我对CMake不太在行,如果谷歌无法解决这个问题,请创建一个新问题,并在此处的评论中发布一个链接。