컴파일러에 플래그를 가져 오기 위해 CMake에서 제공하는 여러 메커니즘이 있습니다.
현대적인 사용에서 다른 방법보다 선호되는 방법이 있습니까? 그렇다면 왜? 또한이 방법을 MSVC와 같은 여러 구성 시스템에서 어떻게 사용할 수 있습니까?
컴파일러에 플래그를 가져 오기 위해 CMake에서 제공하는 여러 메커니즘이 있습니다.
현대적인 사용에서 다른 방법보다 선호되는 방법이 있습니까? 그렇다면 왜? 또한이 방법을 MSVC와 같은 여러 구성 시스템에서 어떻게 사용할 수 있습니까?
답변:
최신 CMake (버전 2.8.12 이상)의 경우 target_compile_options
내부적으로 대상 속성을 사용 하는를 사용해야합니다 .
CMAKE_<LANG>_FLAGS
전역 변수이며 가장 오류가 발생하기 쉽습니다. 또한 매우 편리 할 수있는 생성기 표현식을 지원하지 않습니다 .
add_compile_options
디렉토리 속성을 기반으로하는데, 어떤 상황에서는 괜찮지 만 일반적으로 옵션을 지정하는 가장 자연스러운 방법은 아닙니다.
target_compile_options
소스 파일에 대한 컴파일 옵션은 파일이 속한 프로젝트에 따라 결정 되므로 ( COMPILE_OPTIONS
및 INTERFACE_COMPILE_OPTIONS
대상 속성 설정을 통해) 대상별로 작동합니다. 일반적으로 가장 깨끗한 CMake 코드가 생성됩니다. 하드 디스크에 있음). 이는 요청시 종속 대상에 대한 옵션 전달을 자동으로 처리 한다는 추가적인 이점이 있습니다 .
조금 더 장황하지만 대상별 명령을 사용하면 다양한 빌드 옵션을 합리적으로 세밀하게 제어 할 수 있으며 장기적으로 두통을 유발할 가능성이 가장 적습니다.
이론적으로는를 사용하여 각 속성을 직접 설정할 수도 set_target_properties
있지만 target_compile_options
일반적으로 더 읽기 쉽습니다.
예를 들어 foo
생성기 표현식을 사용하여 구성을 기반으로 대상의 컴파일 옵션을 설정하려면 다음과 같이 작성할 수 있습니다.
target_compile_options(foo PUBLIC "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>")
target_compile_options(foo PUBLIC "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")
target_compile_options
추가 옵션은, 그래서 당신이 좋아하는 마지막 줄을 수정할 수 있습니다 이 더 읽기)로 만들려면
COMPILE_OPTIONS
디렉토리 속성이이를 수행합니다. 이 add_compile_options
명령을 사용하여 설정할 수 있습니다 . 이것이 좋은 접근 방식 인 옵션은 일반적으로 거의 없으며 그 사이에 있습니다.
PUBLIC
인은 target_compile_options
?