Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Caching CMake使用命令行重写缓存的变量_Caching_Cmake - Fatal编程技术网

Caching CMake使用命令行重写缓存的变量

Caching CMake使用命令行重写缓存的变量,caching,cmake,Caching,Cmake,据我所知,当通过命令行使用cmake(例如-DMy\u Var=ON)提供变量时,该变量存储在缓存中。当在以后运行CMake脚本时访问该变量时,它将始终获取存储在缓存中的值,忽略命令行上任何后续的-DMy\u Var=OFF参数 我知道您可以使用force或删除缓存文件,强制在CMakeLists.txt文件中覆盖缓存变量,但是我想知道是否有一种好的方法可以使-DMy\u Var=XXX在每次指定时都有效 我怀疑答案不是在单个构建中更改这些变量,而是为不同的配置使用单独的构建子目录。有人能澄清一

据我所知,当通过命令行使用
cmake
(例如
-DMy\u Var=ON
)提供变量时,该变量存储在缓存中。当在以后运行CMake脚本时访问该变量时,它将始终获取存储在缓存中的值,忽略命令行上任何后续的
-DMy\u Var=OFF
参数

我知道您可以使用
force
或删除缓存文件,强制在CMakeLists.txt文件中覆盖缓存变量,但是我想知道是否有一种好的方法可以使
-DMy\u Var=XXX
在每次指定时都有效

我怀疑答案不是在单个构建中更改这些变量,而是为不同的配置使用单独的构建子目录。有人能澄清一下吗?

你可以用

CMake -UMy_Var -DMy_Var=new_value
见文件


我希望这能有所帮助。

我找到了两种更改CMake变量的方法

前一个答案中建议了第一个:

cmake -U My_Var -D Mu_Var=new_value
第二种方法(我更喜欢)是使用CMake内部变量。在这种情况下,您的变量仍将在CMake缓存中,但如果使用
-D My_Var=…
指定变量,则它们将随着每次
CMake
调用而更改。缺点是这些变量无法从GUI或用户缓存变量列表中看到。我对内部变量使用以下方法:

if (NOT DEFINED BUILD_NUMBER)
  set(BUILD_NUMBER "unknown")
endif()
它允许我从命令行设置
BUILD\u编号
(这在CI服务器上特别有用):

cmake-D构建编号=4242

使用这种方法,如果您不指定您的
BUILD\u编号
(但它是在以前的调用中指定的),它将使用缓存的值。

巧合地找到这篇文章

似乎OP描述的行为不适用于CMake 3.12以后的版本。对于以前的版本,我没有进行一些测试,因此无法确认

命令行上
-D
提供的变量存储在CMakeCache.txt中。可以重写它们,即使重复提供相同的变量,并且最后一个变量设置为该变量的值

例如,一个非常简单的CMake脚本

message(STATUS "FOO = " ${FOO})
$cmake-DFOO=123-DFOO=321最后一项生效
--FOO=321
--配置完成
--生成完成
--生成文件已写入:xxx
$cmake缓存被记住
--FOO=321
--配置完成
--生成完成
--生成文件已写入:xxx
$cmake-DFOO=已更改覆盖它
--FOO=已更改
--配置完成
--生成完成
--生成文件已写入:xxx

那么为什么投票被否决?对于所描述的问题,这是一个非常好的解决方案。
message(STATUS "FOO = " ${FOO})