【发布时间】:2011-12-21 09:42:36
【问题描述】:
我有一个 CMAKE 配置,其中我的所有项目配置都包含 /RTC1(两个运行时检查)编译器标志。但是,我希望只为一个项目切换到Default 选项,因为它也有/clr 编译器标志;这与运行时检查标志不兼容。我对 CMAKE 比较陌生,所以这可能有一个明显的解决方案,但到目前为止我一直找不到这个。
任何帮助将不胜感激。
【问题讨论】:
标签: configuration cmake
我有一个 CMAKE 配置,其中我的所有项目配置都包含 /RTC1(两个运行时检查)编译器标志。但是,我希望只为一个项目切换到Default 选项,因为它也有/clr 编译器标志;这与运行时检查标志不兼容。我对 CMAKE 比较陌生,所以这可能有一个明显的解决方案,但到目前为止我一直找不到这个。
任何帮助将不胜感激。
【问题讨论】:
标签: configuration cmake
我没有找到可以很好地删除特定选项的解决方案,但我确实找到了一种使用 REGEX REPLACE 从编译器标志变量中删除选项的方法:
STRING (REGEX REPLACE "/RTC(su|[1su])" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
这可能不是最理想的方法,但它在我的特殊情况下效果很好。
【讨论】:
CMAKE_C_FLAGS 和CMAKE_C_FLAGS_DEBUG 重复这个。我使用the pattern from SDL2's CMakeLists.txt here 循环执行此操作。
/RTC1 和 -RTC1。要删除两者,我使用了STRING (REGEX REPLACE "[/|-]RTC(su|[1su])" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
如果您使用add_definitions() 添加标志,则可以使用remove_definitions 删除它们,请参阅documentation。
此外,您还可以使用COMPILE_DEFINITIONS 目标属性。
【讨论】:
remove_definitions,但原来的设置是使用set (...) 设置的,所以remove_definitions 不起作用。我最终使用 REGEX REPLACE 命令解决了这个问题。
我最近遇到了同样的问题,但没有找到优雅的解决方案。然而,这段代码完成了这项工作:
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$<$<CONFIG:Debug>: /RTC1 >,它仅在调试中扩展为/RTC1。
【讨论】: