2011-12-21 2 views
7

모든 프로젝트 구성에 /RTC1 (두 런타임 검사) 컴파일러 플래그가 포함 된 CMAKE 구성이 있습니다. 그러나 하나의 프로젝트에 대해서만 Default 옵션으로 전환하고 싶습니다. /clr 컴파일러 플래그가 있습니다. 이는 런타임 검사 플래그와 호환되지 않습니다. 나는 CMAKE에 비교적 익숙하지 않기 때문에 이것이 명백한 해결책을 가지고 있을지도 모르지만, 나는 이것을 찾아 낼 수 없었다.CMAKE에서 런타임 검사 컴파일러 플래그를 프로젝트 당

도움을 주시면 감사하겠습니다.

답변

10

내가 잘 특정 옵션을 제거 할 수있다 해결책을 찾기 위해 관리하지 않은,하지만 난 정규식 교체 사용 변수 컴파일러 플래그에서 옵션을 제거하는 방법 찾았어요 :

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

이것은 가장 이상적인 접근 방식이 아닐 수도 있습니다. 그것은 특별한 상황에 처한 상황에서 잘 작동합니다.

+0

FWIW, 나는 이것을'CMAKE_C_FLAGS'와'CMAKE_C_FLAGS_DEBUG'와 함께 반복해야했다. 나는 이것을 [SDL2의 CMakeLists.txt 패턴] (https://github.com/spurious/SDL-mirror/blob/release-2.0.3/CMakeLists.txt#L158)을 사용하여 반복했다. –

2

add_definitions() 플래그를 추가하는 경우 remove_definitions으로 플래그를 제거 할 수 있습니다 (documentation 참조).

또한 COMPILE_DEFINITIONS 대상 속성으로 게임을 할 수 있습니다.

+0

'remove_definitions'을 사용해 보았지만 원래 설정은'set (...) '을 사용하여 설정 되었기 때문에'remove_definitions'가 작동하지 않았습니다. 나는 REGEX REPLACE 명령을 사용하여이 문제를 해결했다. –

+0

알겠습니다. 귀하의 질문에서 명확하지 않았습니다. – arrowd

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 플래그를 취소해야하는 경우 :

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으로 확장됩니다.