Configuration 删除CMAKE中每个项目的运行时检查编译器标志

Configuration 删除CMAKE中每个项目的运行时检查编译器标志,configuration,cmake,Configuration,Cmake,我有一个CMAKE配置,其中我的所有项目配置都包括/RTC1(两个运行时检查)编译器标志。但是,我希望只为一个项目切换到默认选项,因为它还具有/clr编译器标志;与运行时检查标志不兼容。我对CMAKE比较陌生,所以这可能有一个明显的解决方案,但到目前为止我还没有找到 非常感谢您的帮助。如果您使用添加定义()添加标志,则可以使用删除定义来删除标志,请参阅 此外,您还可以使用target属性。我没有找到一个可以很好地删除特定选项的解决方案,但我找到了一种使用REGEX REPLACE从编译器标志变量

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


非常感谢您的帮助。

如果您使用
添加定义()
添加标志,则可以使用
删除定义来删除标志,请参阅


此外,您还可以使用target属性。

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

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

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

我最近也遇到了同样的问题,没有找到完美的解决方案。但是,此代码执行以下操作:

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()
STRING(REGEX REPLACE)/RTC[^]*“CMAKE\u CXX\u FLAGS\u DEBUG”${CMAKE\u CXX\u FLAGS\u DEBUG}”)
foreach(此处为目标值)
目标编译选项(${target\u var}PRIVATE$)
endforeach()

请注意,仅在调试中使用扩展为
$
$

我尝试使用
remove\u definitions
,但原始设置是使用
set(…)
设置的,因此
remove\u definitions
不起作用。最后,我用一个REGEX REPLACE命令解决了这个问题。FWIW,我不得不用
CMAKE\u C\u标志
CMAKE\u C\u标志\u DEBUG
重复这个过程。我在一个循环中使用.C/C++标记填充了
/RTC1
-RTC1
。为了删除这两个,我使用了
字符串(REGEX替换“[/|-]RTC(su |[1su])”、“CMAKE_CXX_标志”${CMAKE_CXX_标志}”)