Caching 对CMake感到困惑';s缓存的变量设置优先级

Caching 对CMake感到困惑';s缓存的变量设置优先级,caching,cmake,Caching,Cmake,我对CMake的缓存变量感到困惑: 案例1:缓存+强制 set(CMAKE_CXX_FLAGS "myflags" CACHE STRING "" FORCE) 第一次CMake运行:“myflags”按预期显示在CMakeCache.txt文件中 命令行选项:命令行选项不覆盖“myflags”-似乎强制的优先级高于命令行-D..=“…”参数。这是不需要的-我希望命令行参数覆盖“myflags” 案例2:仅缓存 set(CMAKE_CXX_FLAGS "myflags" CACHE

我对CMake的缓存变量感到困惑:

  • 案例1:
    缓存
    +
    强制

    set(CMAKE_CXX_FLAGS "myflags" CACHE STRING "" FORCE)
    
    • 第一次CMake运行:
      “myflags”
      按预期显示在
      CMakeCache.txt
      文件中
    • 命令行选项:命令行选项不覆盖
      “myflags”
      -似乎
      强制
      的优先级高于命令行
      -D..=“…”
      参数。这是不需要的-我希望命令行参数覆盖
      “myflags”

  • 案例2:仅
    缓存

    set(CMAKE_CXX_FLAGS "myflags" CACHE STRING "")
    
    • 第一次CMake运行:
      CMakeCache.txt
      文件中不显示任何内容。我想在第一次运行时显示
      “myflags”
    • 命令行选项:命令行优先于
      “myflags”

我的结论正确吗?或者“默认变量”如
CMAKE\u CXX\u标志
的行为是否不同?

在第一次运行CMake时(以前没有在此文件夹中运行CMake时),是否有办法将
中的“myflags”
写入
CMakeCache.txt
文件?

我想在缓存中第一次运行CMake时设置
“myflags”
,然后允许用户使用命令行覆盖它

如果我使用
FORCE
,用户无法通过命令行覆盖它


如果我不使用
FORCE
“myflags”
在第一次运行时不会写入缓存文件。

这与以下说明的行为一致:

通常,set(…CACHE…)创建缓存变量,但不修改它们。如果指定了FORCE,则设置缓存变量的值,即使该变量已在缓存中。这通常应该避免,因为它将删除用户对缓存变量值的任何更改


CMAKE\u CXX\u标志
即使在CMakeLists.txt中未设置
set(CMAKE\u CXX\u标志…缓存…
),也会出现在缓存中,因为
CMAKE\u CXX\u标志
变量已在编译器标志初始化期间设置

谢谢你的澄清。我现在明白了。还有一件事:你会建议我如何实施我想要的行为?(在第一次运行时填充
CMAKE_CXX_标志
,然后允许用户覆盖它们。)我应该检查变量是否为空并在这种情况下填充它吗?对于自定义CXX标志(例如
MYFLAGS
)使用不同的变量并合并它集(CMAKE_CXX_标志“${CMAKE_CXX_标志}${MYFLAGS}`?