gpt4 book ai didi

CMake:如何根据选项(和编译器/构建配置)设置生成器表达式

转载 作者:行者123 更新时间:2023-12-03 15:49:46 30 4
gpt4 key购买 nike

我有以下生成器表达式工作,它设置 /GS如果编译器是 MSVC 并且它为构建配置设置了标志 RelWithDebInfoRelease :

target_compile_options(mytarget PRIVATE
"$<$<CONFIG:Release>: $<$<CXX_COMPILER_ID:MSVC>:/GS>>
$<$<CONFIG:RelWithDebInfo>:$<$<CXX_COMPILER_ID:MSVC>:/GS>>")
现在我也想让用户配置这个,我添加了一个 option : option(MYTARGET_ENABLE_GS "Enable /GS" OFF)所以现在,我(显然)想要启用 /GS标志是否用户启用了此选项,如果启用了,如果编译器是 MSVC,我想添加它,并且应该将它添加到 ReleaseRelWithDebInfo配置。
这是非常嵌套的,我似乎无法正确理解。这是我得到的:
target_compile_options(mytarget PRIVATE
"$<$<BOOL:MYTARGET_ENABLE_GS>:
$<$<CONFIG:Release>: $<$<CXX_COMPILER_ID:MSVC>:/GS>>
$<$<CONFIG:RelWithDebInfo>:$<$<CXX_COMPILER_ID:MSVC>:/GS>>>")
编辑:固定,见下文。
我不得不使用 $<$<BOOL:...>>因为那“翻译”了 option (可以是开/关或真/假,到 01 ,这是生成器表达式所需的。
但是以上行不起作用:它不添加(或不添加) /GS .
我想知道:
1)我的错误在哪里?这该怎么做?和
  • 像这样的东西会导致非常复杂的嵌套表达式,这真的很难阅读 - 想象一下 6 个月后再次阅读该行代码,即使它被记录在案。而且很容易放错 >或类似的东西。
    我可能可以使用“手动”if s 使其更具可读性,但想象一下有 5-10 个这样的选项 - 写一个 if/endtarget_compile_options里面的结果是 15-30 行 if/end代码,这也不是很漂亮。做到这一点的最佳方法是什么?

  • 编辑:我快到了。变量必须用 ${...} 括起来在生成器表达式中。所以它是例如:
    target_compile_options(mytarget PRIVATE
    "$<$<BOOL:${MYTARGET_ENABLE_GS}>:
    $<$<CONFIG:Release>: $<$<CXX_COMPILER_ID:MSVC>:/GS>>
    $<$<CONFIG:RelWithDebInfo>:$<$<CXX_COMPILER_ID:MSVC>:/GS>>>")
    这很好用。
    这仍然留下点“2)”,我很想获得洞察力。

    最佳答案

    当您生成 MSVC 解决方案时,构建类型(发布、调试等)在您实际运行构建之前是未知的。因此,为此使用生成器表达式是正确的。
    但是对于其他 2 个变量(用户是否将 MYTARGET_ENABLE_GS 设置为 OFF 并为 MSVC 执行生成),它们在配置时解决。因此,您不必在生成器表达式中检查它们。你可以简单地写:

    if(MSVC AND MYTARGET_ENABLE_GS)
    target_compile_options(mytarget PRIVATE "$<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:/GS>")
    endif()
    此解决方案还使用 $<OR:?[,?]...>生成器表达式在同一表达式下重新组合您在 Release OR RelWithDebInfo 中构建的两种情况

    关于CMake:如何根据选项(和编译器/构建配置)设置生成器表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50430185/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com