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
CMake集缓存正在使用;“缓存”;作为变量_Cmake - Fatal编程技术网

CMake集缓存正在使用;“缓存”;作为变量

CMake集缓存正在使用;“缓存”;作为变量,cmake,Cmake,我试图从命令行重写我的_VAR的默认值,但得到了一个意外结果: 摘自my CMakeLists.txt: set( MY_VAR MY_VAR_DEF_VALUE CACHE INTERNAL "This is my_var" [FORCE] ) message( "MY_VAR = ${MY_VAR}" ) cmake命令: cmake -DMY_VAR:INTERNAL=MY_VAR_USER_VALUE .. 输出: MY_VAR = MY_VAR_DEF_VALUE;CACHE;IN

我试图从命令行重写我的_VAR的默认值,但得到了一个意外结果:

摘自my CMakeLists.txt:

set( MY_VAR MY_VAR_DEF_VALUE CACHE INTERNAL "This is my_var" [FORCE] )
message( "MY_VAR = ${MY_VAR}" )
cmake命令:

cmake -DMY_VAR:INTERNAL=MY_VAR_USER_VALUE ..
输出:

MY_VAR = MY_VAR_DEF_VALUE;CACHE;INTERNAL;This is my_var;[FORCE]
我希望输出为:

MY_VAR = MY_VAR_USER_VALUE
奇怪的是,我的变量在CMakeCache.txt中得到了正确更新,请参见摘录:

//No help, variable specified on the command line.

MY_VAR:INTERNAL=MY_VAR_USER_VALUE
注意:我正在进行源代码外构建

更新(11/15/15):

我去掉了力周围的方括号,输出为:

MY_VAR=MY_VAR_DEF_值

I移除力后,输出为:

MY_VAR=MY_VAR_DEF_值

其工作方式如下:

cd path/to/build/dir && cmake -DVAR=VALUE path/to/src
首先,从
path/to/src/CMakeLists.txt
运行cmake脚本(步骤1) 之后,它将
VAR
设置为适当的值(步骤2)。 在CMakeLitst.txt中,您有:

set(VAR DEF_VALUE FORCE)
message(STATUS "VAR: ${VAR}")
FORCE
告诉cmake rewrite cache,这样在步骤1中就有了默认值, 之后,cmake打印其值,当然是
DEF_值
, 之后,它使用
-D
命令设置缓存。

它的工作方式如下:

cd path/to/build/dir && cmake -DVAR=VALUE path/to/src
首先,从
path/to/src/CMakeLists.txt
运行cmake脚本(步骤1) 之后,它将
VAR
设置为适当的值(步骤2)。 在CMakeLitst.txt中,您有:

set(VAR DEF_VALUE FORCE)
message(STATUS "VAR: ${VAR}")
FORCE
告诉cmake rewrite cache,这样在步骤1中就有了默认值, 之后,cmake打印其值,当然是
DEF_值

然后,它用
-D
命令设置缓存。

从set命令中删除
[FORCE]
选项,并用指示变量类型的关键字之一(
BOOL
字符串
)替换
内部
选项。
FORCE
选项将导致您的
CMakeLists.txt
覆盖您在命令行上指定的任何内容。指定
内部
意味着
强制
(请参阅)


您看到的奇怪行为的一部分可能是因为您在
FORCE
周围包含了方括号。如果您确实想使用
FORCE
(CMake文档中的方括号仅用于指示它是一个可选参数),则方括号不应存在。

删除
[FORCE]
选项,并将
内部
选项替换为指示变量类型的关键字之一(
BOOL
字符串
,等等)。
FORCE
选项将导致您的
CMakeLists.txt
覆盖您在命令行上指定的任何内容。指定
内部
意味着
强制
(请参阅)


您看到的奇怪行为的一部分可能是因为您在
FORCE
周围包含了方括号。如果您确实想使用
FORCE
(CMake文档中的方括号只是为了表明它是一个可选参数)。

Craig,&是缓存模式的必填字段,如果删除内部,我会得到以下错误:CMakeLists.txt处的CMake error:18(set):为缓存模式设置无效参数。我的答案可能不清楚。我对其进行了重新措辞,以明确您需要将内部更改为指定类型之一,而不是将其完全删除。其他4种类型都不符合我的要求,我实际上是在预定义路径中使用我的_VAR作为文件夹名。i、 e./path/to/${MY_VAR}/文件夹。我希望该值在连续的cmake调用中保持不变,因此我认为如果它起作用,INTERNAL将是理想的选择。就我所知,INTERNAL基本上等同于STRING。字符串本质上意味着它在CMake GUI中没有得到特殊处理,只提供了一个简单的行编辑来修改它的值。Craig和&是缓存模式的必填字段,如果我删除内部字段,我会得到以下错误:CMake error at CMakeLists.txt:18(set):set给定了缓存模式的无效参数。我的答案可能不清楚。我对其进行了重新措辞,以明确您需要将内部更改为指定类型之一,而不是将其完全删除。其他4种类型都不符合我的要求,我实际上是在预定义路径中使用我的_VAR作为文件夹名。i、 e./path/to/${MY_VAR}/文件夹。我希望该值在连续的cmake调用中保持不变,因此我认为如果它起作用,INTERNAL将是理想的选择。就我所知,INTERNAL基本上等同于STRING。字符串本质上意味着它在CMake GUI中没有得到特殊处理,只提供了一个简单的行编辑来修改它的值。