我对CMake的缓存变量感到困惑:
案例1:CACHE
+ FORCE
set(CMAKE_CXX_FLAGS "myflags" CACHE STRING "" FORCE)
"myflags"
按预期显示在CMakeCache.txt
文件中。"myflags"
- 似乎FORCE
的优先级高于命令行-D...="..."
参数。这不是我们想要的 - 我希望命令行参数覆盖"myflags"
。案例2:仅CACHE
set(CMAKE_CXX_FLAGS "myflags" CACHE STRING "")
CMakeCache.txt
文件中没有任何内容。我希望第一次出现"myflags"
。"myflags"
。 我的结论是否正确?或者做"默认变量"例如CMAKE_CXX_FLAGS
表现不同?
有没有办法在第一次CMake运行期间({CM}以前没有在此文件夹中运行)在"myflags"
文件中写入CMakeCache.txt
?
我希望在缓存中的第一次CMake运行期间设置"myflags"
,然后允许用户使用命令行覆盖它。
如果我使用FORCE
,则用户无法通过命令行覆盖它。
如果我不使用FORCE
,则在首次运行期间,"myflags"
不会写入缓存文件。
答案 0 :(得分:12)
即使在CMakeLists.txt中没有通常,set(... CACHE ...)会创建缓存变量,但不会修改它们。如果指定了FORCE,则设置缓存变量的值,即使该变量已在缓存中。通常应该避免这种情况,因为它将删除用户对缓存变量值的任何更改。
CMAKE_CXX_FLAGS
, set(CMAKE_CXX_FLAGS ... CACHE ...)
也存在于缓存中,因为在编译器标志初始化期间已经设置了CMAKE_CXX_FLAGS
变量。