无法使用PARENT_SCOPE访问函数内定义的cmake变量

时间:2017-10-31 13:11:31

标签: cmake

所以我有以下CMake代码:

hasClass

function(get_sources output_var) set(${output_var} "a" PARENT_SCOPE) message(${output_var}) # prints "SOURCES" (as expected) message(${${output_var}}) # throws an error - why? ... endfunction(get_sources) get_sources(SOURCES) message(${SOURCES}) # prints "a" - ok, so the above function created a var 函数应该在父作用域中创建一个给定名称的变量,并用一些内容填充它。

似乎get_sources按预期创建变量 - get_sources(SOURCES)外部函数打印“a”,但行message(${SOURCES})出现问题。它应评估为message(${${output_var}})并打印“a”,但它会抛出错误:

message(a)

我很困惑。这应该是那样的吗?我应该创建一个函数范围的变量,填写它,然后在最后将其内容复制到父范围变量?我检查了它 - 它有效,但我希望它没有任何其他变量。

修改: 我在引号中附加了CMake Error at CMakeLists.txt:41 (message): message called with incorrect number of arguments ,现在它不会抛出错误,但它什么都不打印。

1 个答案:

答案 0 :(得分:2)

PARENT_SCOPE 仅为父范围设置变量,而不为当前范围设置变量。这在boom中明确说明:

  

如果给出 PARENT_SCOPE 选项,则变量将在当前范围上方的范围内设置。每个新目录或函数都会创建一个新范围。此命令将变量的值设置为父目录或调用函数(适用于手头的情况)。 变量值的先前状态在当前范围内保持不变(例如,如果之前未定义,则仍未定义,如果它有值,则仍然是该值)。

这是处理PARENT_SCOPE变量的正确方法:

  

我应该创建一个函数作用域变量,填写它然后在最后将其内容复制到父作用域变量吗?