Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/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
Variables 如何隐藏CMake变量?_Variables_Cmake_Trace - Fatal编程技术网

Variables 如何隐藏CMake变量?

Variables 如何隐藏CMake变量?,variables,cmake,trace,Variables,Cmake,Trace,我有一个CMake项目,它允许一个全局设置变量(在命令行上用-DARDUINO_SDK_PATH=/a/b/c设置)消失,即突然给定值消失,从而导致致命错误 我知道有不同的方法“隐藏”变量(例如内部函数或外部项目) 就我而言: 未在代码中的任何位置明确设置变量(例如,通过set()或find\u path()) 导致错误的访问位于顶层(即不在函数内部) 有一些说明(即,相同的文件/行),其中一种情况下,变量具有给定的值,下一次该值消失 使用variable\u watch(ARDUINO\u

我有一个CMake项目,它允许一个全局设置变量(在命令行上用
-DARDUINO_SDK_PATH=/a/b/c
设置)消失,即突然给定值消失,从而导致致命错误

我知道有不同的方法“隐藏”变量(例如内部函数或外部项目)

就我而言:

  • 未在代码中的任何位置明确设置变量(例如,通过
    set()
    find\u path()
  • 导致错误的访问位于顶层(即不在函数内部)
  • 有一些说明(即,相同的文件/行),其中一种情况下,变量具有给定的值,下一次该值消失
使用
variable\u watch(ARDUINO\u SDK\u PATH)
跟踪变量,在检查编译器之前,我可以看到一切正常:

cmake -DARDUINO_SDK_PATH=/a/b/c <path>
...
... everything fine, ${DARDUINO_SDK_PATH} == '/a/b/c' everywhere
...

-- Check for working C compiler: /usr/bin/avr-gcc

...
... here the variable is empty and not being traced any more
...
cmake-DARDUINO\u SDK\u路径=/a/b/c
...
... 一切正常,${DARDUINO_SDK_PATH}=='/a/b/c'无处不在
...
--检查C编译器是否工作:/usr/bin/avr gcc
...
... 这里的变量是空的,不再被跟踪
...
以下是我的建议: 编译器检查(在终端上用
check for working C compiler..
表示)是否有自己的变量空间,并且不知道命令行上提供的变量


注意:这个问题是对这个问题的概括,这个问题已经变得过于专业化,但可能会提供一些有用的背景信息。

variable\u watch()
命令之后,对变量的任何修改都不会被跟踪,这对我来说似乎是CMake中的一个bug

一般来说,“缓存的CMake变量”可以被同名的“普通CMake变量”隐藏。但是,例如,
find_path()
不会再次运行或修改已设置的变量

以下是一个例子:

cmake_minimum_required(VERSION 2.4)

project(VariableWatchTest NONE)

variable_watch(MY_TEST_VAR)

set(MY_TEST_VAR "something" CACHE INTERNAL "")
message("${MY_TEST_VAR}")

set(MY_TEST_VAR "hiding something")
message("${MY_TEST_VAR}")

unset(MY_TEST_VAR)
message("${MY_TEST_VAR}")

find_path(MY_TEST_VAR NAMES "CMakeLists.txt" HINTS "${CMAKE_CURRENT_LIST_DIR}")
message("${MY_TEST_VAR}")
将给出(不带
变量的\u watch()
消息:

-- something
-- hiding something
-- something
-- something
参考资料


我不确定这是一个错误还是一个功能,但(至少有些)CMake变量在CMake配置过程的某些步骤中不可用

可以通过向工具链文件中添加类似的内容来检查这一点:

MESSAGE("FOO: ${FOO}")
像这样运行CMake

cd build-dir
cmake -DFOO=TEST ..
在配置过程开始时,您可能会看到
FOO
以值
TEST
打印一次,然后再次打印,但为空

只是不要从工具链文件中的全局空间访问变量(反正不属于那里)