【问题标题】:When should I wrap variables with ${...} in CMake?我什么时候应该在 CMake 中用 ${...} 包装变量?
【发布时间】:2014-09-12 13:20:47
【问题描述】:

我想知道为什么 CMake 中的变量经常用美元符号和花括号括起来。比如我看到了这个电话in a CMake tutorial

include_directories(${PROJECT_BINARY_DIR})

但从我的尝试来看,这是同样的事情。

include_directories(PROJECT_BINARY_DIR)

什么时候需要用${...} 包装,这是什么意思?为什么变量经常用 this 包裹,即使它没有区别?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    引用the CMake documentation:

    变量引用具有${variable_name} 的形式并被评估 在引用的参数或未引用的参数中。变量引用 被变量的值替换,或者被空字符串替换 变量未设置。

    换句话说,写作PROJECT_BINARY_DIR 是指字符串“PROJECT_BINARY_DIR”。将其封装在 ${...} 中会为您提供名为 PROJECT_BINARY_DIR 的变量的内容

    考虑:

    set(FOO "Hello there!")
    message(FOO)     # prints FOO
    message(${FOO})  # prints Hello there!
    

    您可能已经猜到了,include_directories(PROJECT_BINARY_DIR) 只是尝试将名为 PROJECT_BINARY_DIR 的子目录添加到包含目录中。在大多数构建系统上,如果不存在这样的目录,它将简单地忽略该命令,这可能会让您误以为它可以按预期工作。

    一个常见的混淆来源是if() 不需要显式取消引用变量:

    set(FOO TRUE)
    if(FOO)
        message("Foo was set!")
    endif()
    

    再次the documentation explains this behavior:

    if(<constant>)

    如果常量为 1、ON、YES、TRUE、Y 或非零数字,则为真。如果常数为 0、OFF、NO、FALSE、N、IGNORE、NOTFOUND,则为 False 空字符串,或以后缀 -NOTFOUND 结尾。命名布尔常量 不区分大小写。如果参数不是这些常量之一, 它被视为一个变量。

    if(<variable>)

    如果变量被定义为一个不是假常量的值,则为真。否则为假。 (注意宏参数不是变量。)

    特别是,人们可以想出一些奇怪的例子,例如:

    unset(BLA)
    set(FOO "BLA")
    if(FOO)
        message("if(<variable>): True")
    else()
        message("if(<variable>): False")
    endif()
    if(${FOO})
        message("if(<constant>): True")
    else()
        message("if(<constant>): False")
    endif()
    

    在变量情况下将采用TRUE 分支,在常量情况下采用FALSE 分支。这是因为在常量情况下,CMake 会寻找变量BLA 来执行检查(未定义,因此我们最终会进入 FALSE 分支)。

    【讨论】:

    • if (SFML_FOUND) 这样的东西是如何工作的呢?
    • if() 是一种特殊情况,因为它适用于变量和值。虽然if(SFML_FOUND)if(${SFML_FOUND}) 可能都有效,但它们实际上做了不同的事情:检查the documentation for if 并特别注意if(&lt;constant&gt;)if(&lt;variable&gt;) 之间的区别。我会相应地更新答案。
    • 文档没有解释&lt;condition&gt;&lt;condN&gt; 是如何工作的:每个表达式都可以是&lt;variable&gt;|&lt;constant&gt; 还是只适用于顶级表单? 用法似乎表明它适用于所有形式。
    【解决方案2】:

    这是每个案例。它的定义很差。你只需要查一下。 除了 IF,还有其他地方您不必使用 {} 来使用变量的内容。哎呀。

    【讨论】:

      猜你喜欢
      • 2016-06-21
      • 2021-08-21
      • 1970-01-01
      • 2023-03-12
      • 2015-03-30
      • 2023-04-10
      • 1970-01-01
      • 2010-12-30
      相关资源
      最近更新 更多