带有使用多个值的生成器表达式的 CMake set_property 命令

Flo*_*ers 4 build cmake visual-studio cmake-language

我将 CMake v3.13.4 与Visual Studio 2017 Win64生成器一起使用,我需要修改 Visual Studio Librarian(对于 CMake 对象库)的命令行选项。

\n\n

为了实现这一点,CMake 提供了可以通过and命令STATIC_LIBRARY_OPTIONS设置的目标属性。set_propertyset_target_properties

\n\n

文档指出STATIC_LIBRARY_OPTIONS支持生成器表达式:

\n\n
\n

的内容STATIC_LIBRARY_OPTIONS可以使用 \xe2\x80\x9c 生成器表达式\xe2\x80\x9d 和\n 语法$<...>。有关可用表达式,请参阅cmake-generator-expressions(7) \n 手册。有关定义构建系统属性的更多信息,请参阅cmake-buildsystem(7) \n 手册。

\n
\n\n

但是:无论我尝试什么,这些值都没有正确转义\xc2\xb4,例如

\n\n
set_property(TARGET object_library PROPERTY STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:/WX /NOLOGO /LTCG /ERRORREPORT:NONE>)\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 Visual Studio 中会导致以下结果:

\n\n
All Options: `/OUT:"..." /LTCG /MACHINE:X64 /NOLOGO \nAdditional Options: %(AdditionalOptions) /machine:x64 ""$"<1:/WX" "/ERRORREPORT:NONE>"\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试了以下方法,但似乎都失败了。

\n\n
set_property(TARGET object_library PROPERTY\n  STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:/WX /NOLOGO /LTCG /ERRORREPORT:NONE>\n  #STATIC_LIBRARY_OPTIONS "$<$<CONFIG:Release>:/WX /NOLOGO /LTCG /ERRORREPORT:NONE>"\n  #STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:"/WX /NOLOGO /LTCG /ERRORREPORT:NONE">\n  #STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:/WX /NOLOGO /LTCG /ERRORREPORT:NONE>\n  #STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:/WX;/NOLOGO;/LTCG;/ERRORREPORT:NONE>\n  #STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:"/WX;/NOLOGO;/LTCG;/ERRORREPORT:NONE">\n  #STATIC_LIBRARY_OPTIONS "$<$<CONFIG:Release>:/WX;/NOLOGO;/LTCG;/ERRORREPORT:NONE>"\n  )\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以我的问题是:如何使用生成器表达式通过STATIC_LIBRARY_OPTIONSorset_property命令传递多个值set_target_properties

\n

Flo*_*ers 5

感谢@Tsyvarev,我已经能够解决这个问题。解决方案是将每个值包装到其自己的生成器表达式中:

set_property(TARGET object_library PROPERTY
    STATIC_LIBRARY_OPTIONS
      $<$<CXX_COMPILER_ID:MSVC>:/WX>
      $<$<CXX_COMPILER_ID:MSVC>:/NOLOGO>
      $<$<CXX_COMPILER_ID:MSVC>:/ERRORREPORT:NONE>
      $<$<CXX_COMPILER_ID:MSVC>:$<$<CONFIG:Release>:/LTCG>>
  )
Run Code Online (Sandbox Code Playgroud)