> 백엔드 개발 > C++ > 크로스 플랫폼 CMake 프로젝트에서 컴파일러 플래그 설정을 현대화하는 방법은 무엇입니까?

크로스 플랫폼 CMake 프로젝트에서 컴파일러 플래그 설정을 현대화하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-03 11:08:30
원래의
365명이 탐색했습니다.

How to Modernize Compiler Flag Settings in Cross-Platform CMake Projects?

교차 플랫폼 CMake 프로젝트에서 컴파일러 플래그를 설정하는 최신 방법

소개

이 문서에서는 교차 플랫폼 CMake에서 컴파일러 플래그를 설정하는 방법에 대한 지침을 제공합니다. 프로젝트. 기존 접근 방식에 대해 제기된 문제를 해결하고 향상된 방법론을 탐구합니다.

생성기 표현식으로 향상된 구문

이전 접근 방식에서는 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ...")을 사용했습니다. 추가(CMAKE_CXX_FLAGS "...")로 대체됩니다. 또한 "더티 생성기 표현식"을 활용하여 조건을 도입하고 옵션을 간결하게 나열할 수 있습니다.

<code class="cmake">string(
    APPEND _opts
    "$<IF:$<CXX_COMPILER_ID:MSVC>,"
        "/W4;$<$<CONFIG:RELEASE>:/O2>,"
        "-Wall;-Wextra;-Werror;"
            "$<$<CONFIG:RELEASE>:-O3>"
            "$<$<CXX_COMPILER_ID:Clang>:-stdlib=libc++>"
    ">"
)

add_compile_options("${_opts}")</code>
로그인 후 복사

add_compile_options()를 사용한 하위 호환 접근 방식

하위 호환성을 위해 add_compile_options를 사용하는 대체 구문 ()를 사용할 수 있습니다:

<code class="cmake">if(MSVC)
    add_compile_options("/W4" "$<$<CONFIG:RELEASE>:/O2>")
else()
    add_compile_options("-Wall" "-Wextra" "-Werror" "$<$<CONFIG:RELEASE>:-O3>")
    if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
        add_compile_options("-stdlib=libc++")
    else()
        # nothing special for gcc at the moment
    endif()
endif()</code>
로그인 후 복사

target_compile_features()를 사용한 기능 기반 접근 방식

C 표준을 수동으로 지정하는 대신 최신 CMake는 필수 기능을 지정합니다.

<code class="cmake">target_compile_features(HelloWorld PUBLIC cxx_lambda_init_captures)</code>
로그인 후 복사

이를 통해 CMake는 기능을 지원하는 데 필요한 컴파일러 플래그를 결정할 수 있습니다.

다중 구성 빌드 환경

각 컴파일러 및 구성에 대한 별도의 빌드 디렉터리를 피하기 위해 래퍼 스크립트는 다음을 수행할 수 있습니다. Visual Studio와 같은 IDE 또는 다중 구성 CMake 생성기를 사용하여 여러 구성을 컴파일합니다.

위 내용은 크로스 플랫폼 CMake 프로젝트에서 컴파일러 플래그 설정을 현대화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿