【问题标题】:Cmake Generator expressions with multiple entries (spaces?)具有多个条目(空格?)的 Cmake 生成器表达式
【发布时间】:2021-03-10 03:25:33
【问题描述】:

(在写这个问题的过程中我找到了一个解决方案,所以这只是记录它,因为我真的需要它!)

我正在编写一个 c++ 项目并使用 cmake。

在我的 cmake 文件中,我有:

set(MY_DEBUG_WARNINGS "-Og -Wall"
)

# Add warnings:
add_compile_options("$<$<CONFIG:DEBUG>:${MY_DEBUG_WARNINGS}>"
"$<$<CXX_COMPILER_ID:Clang,AppleClang>:-fcolor-diagnostics>"
"$<$<CXX_COMPILER_ID:GNU>:-fdiagnostics-color>"
)

这不起作用,因为编译命令会选择额外的转义引号:

  "/usr/bin/clang++ -I../src/Exception/include -g \"-Og -Wall\" -fcolor-diagnostics - 
  std=c++17 -o src/Exception/CMakeFiles/exception.dir/Exception.cpp.o -c 
  /home/bob/app/src/Exception/Exception.cpp",
  "file": "/home/bob/app/src/Exception/Exception.cpp"  

问题似乎是警告中的空格。

This question 通过将每个值包装在自己的表达式中来“解决”问题,这看起来很奇怪而且非常不切实际。 有没有更简单的方法在生成器表达式中传递带有空格的字符串?

如前所述,我自己找到了一个可接受的解决方案,但尚未将其标记为我接受的答案,因为我不确定,这是一个很好的解决方案,而不是如果我需要在选项本身。

【问题讨论】:

    标签: c++ cmake generator-expression


    【解决方案1】:

    "-Og -Wall" 是一个字符串,而"-Og;-Wall" 是一个列表(因为列表是分号分隔的字符串)。

    所以set(my_list -Og -Wall)(没有双引号)也会创建一个列表。阅读所有相关信息here

    【讨论】:

    • 非常感谢!这终于有道理了!只是我还是 cmake 文档没有帮助?当我尝试阅读它时,我几乎从不理解它,因为它几乎从不包含具体的例子。但也许它不是为新手和更有经验的 cmake 用户编写的。
    • 你知道吗,为什么我不能将列表直接插入到生成器表达式中?就像$&lt;$&lt;CONFIG:DEBUG&gt;:-Og -Wall&gt; 一样,无论是否使用引号,它都不起作用。
    • 另外:我想这是链接问题的更好答案。你也想在那里提供你的答案吗?如果没有,我会的。
    • 同意文档可以从几个示例中大大受益:)。我通常做的是在 github 上搜索东西,例如“target_compile_definitions language:cmake”以找到具体的东西。
    • 由于某种原因,当您在生成器表达式中使用列表时,语法不同,因此元素之间有一个逗号:$&lt;$&lt;PLATFORM_ID:Linux,FreeBSD&gt;:${some_variable}&gt;
    【解决方案2】:

    问题确实是空间问题,可以这样解决:

     set(MY_DEBUG_WARNINGS "-Og;-Wall"
     )
    

    用分号替换所有空格。这样编译命令就变成了:

     "/usr/bin/clang++ -I../src/Exception/include -g -Og -Wall 
     -fcolor-diagnostics -std=c++17 -o 
     src/Exception/CMakeFiles/exception.dir/Exception.cpp.o -c 
     /home/bob/app/src/Exception/Exception.cpp",
    

    确实有效。

    我不知道这是否会在其他地方造成问题,因此非常感谢有更多知识的人发表评论。

    【讨论】:

      猜你喜欢
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      相关资源
      最近更新 更多