CMake:${} 和 "${}" 之间的区别

  • 本文关键字:区别 之间 CMake cmake
  • 更新时间 :
  • 英文 :


在cmake中,类似的东西之间有什么区别

set(any_new_var ${old_var})

set(any_new_var "${old_var}")

有什么重要的区别吗?我什么时候可以使用其中一种或另一种形式?

例如,我尝试下一个小型测试

# test.cmake
# Variable 'a' isn't defined.
set(hola "${a}")
# message(${hola})
message("${hola}")

这个小型测试(cmake-p test.cmake)的输出是一个空行(因为没有定义"a")。如果我取消注释第一条消息,cmake会抛出一个消息错误:

CMake Error at prueba.cmake:6 (message):
message called with incorrect number of arguments

为什么在第二种情况下,它不是抛出和错误,而是空行?

在CMake中,字符串可以被解释为列表。规则很简单:要形成列表,请用分号拆分字符串。例如,字符串值one;two;three可以被认为是三个元素的列表:onetwothree

若要调用命令,请在圆括号之间写入命令名和一些单词。但是,这些单词不以一对一的方式与命令接收的参数相对应。每个单词变成零个或多个自变量,所有自变量连接在一起。除非一个单词被引用,否则它将被视为一个列表,并扩展为多个参数一个被引用的单词总是变成一个单独的自变量。

例如,假设X绑定到one;two;threeY绑定到空字符串,并且Z绑定到foo。以下命令调用有三个单词,但该命令接收四个参数:

some_command(${X} ${Y} ${Z})
# The command receives four arguments:
# 1. one
# 2. two
# 3. three
# 4. foo

如果我们引用这些话,命令会收到三个参数:

some_command("${X}" "${Y}" "${Z}")
# The command receives three arguments:
# 1. one;two;three
# 2. (the empty list)
# 3. foo

回到原来的问题:message命令可以接收不同数量的参数。它获取所有参数,将它们连接到一个字符串中,然后打印该字符串。然而,由于某种未知的原因,它不接受零参数。

message具有多个参数的行为不是很有用,所以您倾向于使用一个带引号的参数:

set(SOURCES foo.c hoo.h)
message(${SOURCES})   # prints foo.cfoo.h
message("${SOURCES}") # prints foo.c;foo.h

此外,当set接收到多个参数时,它会构建一个由分号分隔的参数字符串。然后将变量设置为该字符串。

最新更新