我正在将Visual Studio 2017 Win64
生成器与CMake v3.13.4配合使用,并且需要修改Visual Studio库管理器的命令行选项(对于CMake对象库)。
要实现该目标,CMake提供了STATIC_LIBRARY_OPTIONS
和set_target_properties
命令可以设置的目标属性set_property
。
文档指出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_OPTIONS
或set_property
命令将多个值传递给set_target_properties
?
答案 0 :(得分:1)
假设您有一个列表选项:
1234-5623
您可以通过一个命令为它们创建一个生成器表达式列表:
set(option_list /WX /NOLOGO /LTCG /ERRORREPORT:NONE)
结果列表可以直接使用:
list(TRANSFORM option_list
REPLACE ".+" "$<$<CXX_COMPILER_ID:MSVC>:\\0>"
OUTPUT_VARIABLE option_list_msvc
)
命令流list(TRANSFORM)自CMake 3.12起可用。
答案 1 :(得分:0)
由于@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>>
)
答案 2 :(得分:0)
在下面找到我的答案,正如@Tsyvarev帮助我意识到的那样,对问题的情况无济于事。请改考虑他的回答。 当我发现他在下面的评论很有帮助时,我将答案留在这里,以便您阅读评论。
此答案适用于具有新cmake的未来读者: 正如{firmament在this answer中所详细说明的那样,根据cmake版本的不同,也可以通过以下方式将所有值放入列表中
addEventListener("load", initialize)
并将此列表传递给生成器表达式:
set(my_option_list /WX /NOLOGO /LTCG /ERRORREPORT:NONE)
这适用于使用clang和gcc生成器表达式的cmake 3.18.4。