2

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

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

文档状态STATIC_LIBRARY_OPTIONS支持生成器表达式:

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

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

set_property(TARGET object_library PROPERTY STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:/WX /NOLOGO /LTCG /ERRORREPORT:NONE>)

在 Visual Studio 中导致以下内容:

All Options: `/OUT:"..." /LTCG /MACHINE:X64 /NOLOGO 
Additional Options: %(AdditionalOptions) /machine:x64 ""$"<1:/WX" "/ERRORREPORT:NONE>"

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

set_property(TARGET object_library PROPERTY
  STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:/WX /NOLOGO /LTCG /ERRORREPORT:NONE>
  #STATIC_LIBRARY_OPTIONS "$<$<CONFIG:Release>:/WX /NOLOGO /LTCG /ERRORREPORT:NONE>"
  #STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:"/WX /NOLOGO /LTCG /ERRORREPORT:NONE">
  #STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:/WX /NOLOGO /LTCG /ERRORREPORT:NONE>
  #STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:/WX;/NOLOGO;/LTCG;/ERRORREPORT:NONE>
  #STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:"/WX;/NOLOGO;/LTCG;/ERRORREPORT:NONE">
  #STATIC_LIBRARY_OPTIONS "$<$<CONFIG:Release>:/WX;/NOLOGO;/LTCG;/ERRORREPORT:NONE>"
  )

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

4

3 回答 3

4

感谢@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>>
  )
于 2019-03-21T09:31:58.707 回答
1

假设您有一个选项列表

set(option_list /WX /NOLOGO /LTCG /ERRORREPORT:NONE)

你可以通过一个命令为它们创建一个生成器表达式列表:

list(TRANSFORM option_list
  REPLACE ".+" "$<$<CXX_COMPILER_ID:MSVC>:\\0>"
  OUTPUT_VARIABLE option_list_msvc
)

结果列表可以直接使用:

set_property(TARGET object_library PROPERTY STATIC_LIBRARY_OPTIONS ${option_list_msvc})

命令流列表(TRANSFORM)从 CMake 3.12 开始可用。

于 2020-12-09T19:12:20.563 回答
0

您可以在下面找到我的答案,正如@Tsyvarev 帮助我意识到的那样,这对问题的情况没有帮助。请考虑他的回答。因为我发现他在下面的评论很有帮助,所以我会在这里留下答案,以便您阅读评论。

此答案适用于具有较新 cmake 的未来读者:正如@firmament 在此答案中详述的那样,根据 cmake 版本,也可以通过以下方式将所有值放入列表中

set(my_option_list /WX /NOLOGO /LTCG /ERRORREPORT:NONE)

并将这个列表传递给生成器表达式:

"<$<CONFIG:Release>:${my_option_list}>"

这适用于带有 clang 和 gcc 生成器表达式的 cmake 3.18.4。

于 2020-12-02T11:03:13.417 回答