我有一个CMAKE配置,其中我的所有项目配置都包含/RTC1
(两个运行时检查)编译器标志。但是,我希望只为一个项目切换到Default
选项,因为它还有/clr
编译器标志;这与Runtime Checks标志不兼容。我对CMAKE比较陌生,所以这可能有一个明显的解决方案,但到目前为止我还是无法找到它。
任何帮助都将不胜感激。
答案 0 :(得分:13)
我没有设法找到一个解决方案,我可以很好地删除特定的选项,但我确实找到了一种方法,使用REGEX REPLACE从编译器标志变量中删除选项:
STRING (REGEX REPLACE "/RTC(su|[1su])" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
如果这可能不是最理想的方法,那么它在我特殊情况下的情况下运作良好。
答案 1 :(得分:2)
如果您使用add_definitions()
添加标记,则可以使用remove_definitions
删除它们,请参阅documentation。
此外,您可以使用COMPILE_DEFINITIONS目标媒体资源。
答案 2 :(得分:1)
我最近遇到了同样的问题,但没有找到优雅的解决方案。但是这段代码完成了这项工作:
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
标志(例如Debug),您可以尝试以下方法:
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 $<$<CONFIG:Debug>: /RTC1 >
,仅在调试中扩展为/RTC1
。