CMake에서 일반 컴파일 플래그를 설정하는 최신 방법은 무엇입니까?


84

컴파일러에 플래그를 가져 오기 위해 CMake에서 제공하는 여러 메커니즘이 있습니다.

현대적인 사용에서 다른 방법보다 선호되는 방법이 있습니까? 그렇다면 왜? 또한이 방법을 MSVC와 같은 여러 구성 시스템에서 어떻게 사용할 수 있습니까?


답변:


94

최신 CMake (버전 2.8.12 이상)의 경우 target_compile_options내부적으로 대상 속성을 사용 하는를 사용해야합니다 .

CMAKE_<LANG>_FLAGS전역 변수이며 가장 오류가 발생하기 쉽습니다. 또한 매우 편리 할 수있는 생성기 표현식을 지원하지 않습니다 .

add_compile_options 디렉토리 속성을 기반으로하는데, 어떤 상황에서는 괜찮지 만 일반적으로 옵션을 지정하는 가장 자연스러운 방법은 아닙니다.

target_compile_options소스 파일에 대한 컴파일 옵션은 파일이 속한 프로젝트에 따라 결정 되므로 ( COMPILE_OPTIONSINTERFACE_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}>")

12
참고 target_compile_options 추가 옵션은, 그래서 당신이 좋아하는 마지막 줄을 수정할 수 있습니다 더 읽기)로 만들려면

2
@ComicSansMS 훌륭한 답변과 인터넷에서 찾을 수있는 최고 (그리고 가장 최신). 감사!
Ela782

전 세계적으로 동일한 엄격한 컴파일 플래그 세트를 갖고 싶다면 가장 현대적인 방법은 무엇입니까? target_compile_options 서로 다른 목표를 위해 또 다시 같은 플래그를 지정하면 나쁜 생각입니다
user3667089

1
@ user3667089 대상 특정 속성은 일반적으로 변수 또는 디렉터리 속성에 의해 초기화됩니다. 각 속성에 대한 맨 페이지는 정확히 어떤 속성을 알려줍니다. 컴파일 옵션의 경우 COMPILE_OPTIONS디렉토리 속성이이를 수행합니다. 이 add_compile_options명령을 사용하여 설정할 수 있습니다 . 이것이 좋은 접근 방식 인 옵션은 일반적으로 거의 없으며 그 사이에 있습니다.
ComicSansMS

6
@ComicSansMS의 사용 무엇 PUBLIC인은 target_compile_options?
Ramana Reddy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.