所以我有以下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
,现在它不会抛出错误,但它什么都不打印。
答案 0 :(得分:2)
PARENT_SCOPE 仅为父范围设置变量,而不为当前范围设置变量。这在boom中明确说明:
如果给出 PARENT_SCOPE 选项,则变量将在当前范围上方的范围内设置。每个新目录或函数都会创建一个新范围。此命令将变量的值设置为父目录或调用函数(适用于手头的情况)。 变量值的先前状态在当前范围内保持不变(例如,如果之前未定义,则仍未定义,如果它有值,则仍然是该值)。
这是处理PARENT_SCOPE变量的正确方法:
我应该创建一个函数作用域变量,填写它然后在最后将其内容复制到父作用域变量吗?