使用visual studio
时能直接在项目属性里配置,但如果使用cmake指定msvc时,这种方案就无法实现了。
1. 取消【运行时错误检查】
cmake指定msvc编译时,默认是开启运行时错误检查
的,在CMakeLists.txt中打印CMAKE_CXX_FLAGS_DEBUG
和CMAKE_CXX_FLAGS_RELEASE
就可以看到.
message(${CMAKE_CXX_FLAGS_DEBUG}) # Print Debug Flags Before Changemessage(${CMAKE_CXX_FLAGS_RELEASE}) # Print Release Flags Before Change
里面存在一个/RTCs
选项
这时我们只需要将CMAKE_CXX_FLAGS_DEBUG
和CMAKE_CXX_FLAGS_RELEASE
中的/RTC
替换成空字符串即可,实现方式如下:
macro(RemoveDebugCXXFlag flag)string(REPLACE "${flag}" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")string(REPLACE "${flag}" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")endmacro()macro(RemoveReleaseCXXFlag flag)string(REPLACE "${flag}" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")string(REPLACE "${flag}" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")endmacro()RemoveDebugCXXFlag("/RTCs")RemoveDebugCXXFlag("/RTC1")RemoveDebugCXXFlag("/RTCc")RemoveDebugCXXFlag("/RTCu")RemoveReleaseCXXFlag("/RTCs")RemoveReleaseCXXFlag("/RTC1")RemoveReleaseCXXFlag("/RTCc")RemoveReleaseCXXFlag("/RTCu")
2. 取消【缓冲区安全检查】
直接设置相应FLAGS属性即可,启动缓冲区安全检查
的编译选项是/GS
,取消缓冲区安全检查
的编译选项是/GS-
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_DEBUG} ${CMAKE_BUILD_OPTIONS_FLAGS} /GS-" )set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${CMAKE_BUILD_OPTIONS_FLAGS} /GS-" )
MSVC的编译选项说明可参加:传送门
参考链接:
/q/32945670