【问题标题】:Remove Runtime Checks compiler flag per-project in CMAKE在 CMAKE 中删除每个项目的运行时检查编译器标志
【发布时间】:2011-12-21 09:42:36
【问题描述】:

我有一个 CMAKE 配置,其中我的所有项目配置都包含 /RTC1(两个运行时检查)编译器标志。但是,我希望只为一个项目切换到Default 选项,因为它也有/clr 编译器标志;这与运行时检查标志不兼容。我对 CMAKE 比较陌生,所以这可能有一个明显的解决方案,但到目前为止我一直找不到这个。

任何帮助将不胜感激。

【问题讨论】:

    标签: configuration cmake


    【解决方案1】:

    我没有找到可以很好地删除特定选项的解决方案,但我确实找到了一种使用 REGEX REPLACE 从编译器标志变量中删除选项的方法:

    STRING (REGEX REPLACE "/RTC(su|[1su])" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
    

    这可能不是最理想的方法,但它在我的特殊情况下效果很好。

    【讨论】:

    • FWIW,我不得不用CMAKE_C_FLAGSCMAKE_C_FLAGS_DEBUG 重复这个。我使用the pattern from SDL2's CMakeLists.txt here 循环执行此操作。
    • 我的 C/C++ 标志填充了 /RTC1-RTC1。要删除两者,我使用了STRING (REGEX REPLACE "[/|-]RTC(su|[1su])" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
    【解决方案2】:

    如果您使用add_definitions() 添加标志,则可以使用remove_definitions 删除它们,请参阅documentation

    此外,您还可以使用COMPILE_DEFINITIONS 目标属性。

    【讨论】:

    • 我尝试使用remove_definitions,但原来的设置是使用set (...) 设置的,所以remove_definitions 不起作用。我最终使用 REGEX REPLACE 命令解决了这个问题。
    【解决方案3】:

    我最近遇到了同样的问题,但没有找到优雅的解决方案。然而,这段代码完成了这项工作:

    foreach(flag_var
            CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
            CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
        STRING (REGEX REPLACE "/RTC[^ ]*" "" ${flag_var} "${${flag_var}}")
    endforeach(flag_var)
    set_property(TARGET necessary_targets_here APPEND_STRING PROPERTY COMPILE_FLAGS " /RTC1")
    

    如果您只需要为一种配置(例如调试)清除 /RTC 标志,您可以尝试以下方法:

    STRING (REGEX REPLACE "/RTC[^ ]*" "" CMAKE_CXX_FLAGS_DEBUG  "${CMAKE_CXX_FLAGS_DEBUG}")
    foreach(target_var necessary_targets_here)
      target_compile_options(${target_var} PRIVATE $<$<CONFIG:Debug>: /RTC1>)
    endforeach()
    

    请注意使用generator expression$&lt;$&lt;CONFIG:Debug&gt;: /RTC1 &gt;,它仅在调试中扩展为/RTC1

    【讨论】:

      猜你喜欢
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      相关资源
      最近更新 更多