2017-03-16 10 views
15

GCC 4.x는 --std=c++14 스위치를 C++ 14 코드로 허용하지 않습니다. 대신 --std=c++1y이 필요합니다. 최신 버전은 --std=c++1z이지만 아직 설정되지 않은 --std=c++17은 아닙니다 (2016 년에 작성). 아마도 C++ 11과 비슷한 문제가있을 수 있습니다.CMake가 GCC 버전을 기반으로 std = C++ 14/C++ 1y 또는 C++ 17/C++ 1z를 전달하는 방법은 무엇입니까?

CMake에는 GCC 버전에 따라 올바른 스위치를 전달할 수있는 기능 (모듈 일 가능성이 있음)이 있습니까?

+0

* "아마도 C++ 11과 비슷한 문제가 있습니다."* C++ 11 vs C++ 0x, 이전 버전은 gcc4.7/8에서 소개되었습니다. –

+0

Btw, 오래된 스위치 (0x, 1y, 1z)는 최신 컴파일러를 지원하는 컴파일러에서도 잘 작동하므로이 "올바른"것을 얻을 필요가 없습니다. –

+1

** ** 원시 컴파일러 플래그를 전달하는 것이 CMake 반 패턴이며 메타 빌드 시스템/빌드 시스템 생성기의 전체 개념에 비해이 "올바른"필요성이 ** 있습니다. –

답변

30

특정 C++ 버전을 지정하고자 같은 아마 뭔가 나중에 CMake 3.1이 작업을 수행하고 권장되는 방법은 대상 기본값을 지정합니다 CXX_STANDARD, CXX_STANDARD_REQUIREDCXX_EXTENSIONS 대상 속성 또는 변수 등가물을 사용하는 것입니다 . 자세한 내용은 here를 찾을 수 있습니다,하지만 짧은 버전은 이런 식입니다 :

cmake_minimum_required(VERSION 3.1) 
project(Example) 

set(CMAKE_CXX_STANDARD 14) 
set(CMAKE_CXX_STANDARD_REQUIRED ON) 
set(CMAKE_CXX_EXTENSIONS OFF) 
# ... Define targets, etc. as usual 

CMake는 컴파일러가 지원하는 기반으로 요청 된 C++ 표준에 대한 적절한 컴파일러 플래그를 선택하거나 '아무튼 있는지 에러한다 요청한 표준을 지원합니다.

또한 CMake는 목표 속성 인 CXX_STANDARD에 지정된 언어 표준보다 나중 인 언어 표준을 사용하도록 대상을 업그레이드 할 수 있습니다. compile feature requirements (@FlorianWolters 대답에서 언급 한대로)을 사용하면 언어 표준 요구 사항을 높일 수 있습니다. 실제로, CMake는 항상 타겟에 설정된 CXX_STANDARD 대상 속성 또는 컴파일 기능 요구 사항에 의해 지정된 더 강력한 언어 요구 사항을 선택합니다. 또한 CXX_EXTENSIONS이 컴파일 기능과 상호 작용하는 방식을 정확하게 반영하지 않는다는 점에 유의하십시오. CXX_EXTENSIONS은 대부분의 공통 컴파일러에 대해 CXX_STANDARD이 지정되어있는 경우에만 적용됩니다 (하나의 컴파일러 플래그와 함께 지정되기 때문에).

7

컴파일러에서 플래그를 지원하는지 확인하십시오.

include(CheckCXXCompilerFlag) 

# Check for standard to use 
check_cxx_compiler_flag(-std=c++17 HAVE_FLAG_STD_CXX17) 
if(HAVE_FLAG_STD_CXX17) 
    # Have -std=c++17, use it 
else() 
    check_cxx_compiler_flag(-std=c++1z HAVE_FLAG_STD_CXX1Z) 
    if(HAVE_FLAG_STD_CXX1Z) 
     # Have -std=c++1z, use it 
    else() 
     # And so on and on... 
    endif() 
endif() 
+2

@einpoklum 아무런 추측도없이이 정확한 코드를 문제없이 2 년 동안 사용해 왔습니다. GCC와 Clang 모두 (내가 마지막으로 시도한 것은'-std = C++ 17' 옵션을 지원하지 않았다). –

7

최신 CMake 코드는 target_compile_features 명령을 사용하여 특정 C++ 표준을 요청해야합니다. 이는 빌드 요구 사항 (PRIVATE), 사용 요구 사항 (INTERFACE) 또는 빌드 및 사용 요구 사항 (PUBLIC)으로 지정할 수 있습니다.

예 :

cmake_minimum_required(VERSION 3.9.4) 

project(cpp-snippets) 
add_executable(cpp-snippets "main.cpp") 
target_compile_features(cpp-snippets PRIVATE cxx_std_17) 

은 자세한 내용을 보려면 cmake-compile-features에 대한 공식 CMake 문서에서 언어 표준을 요구하는 부분 을 참조하십시오.

+0

"사용 요구 사항"과 반대되는 "빌드 요구 사항"은 무엇입니까? – einpoklum

+2

'cxx_std_YY' 메타 기능에 대한 지원 또한 CMake 3에서만 추가되었다는 점도 강조되어야합니다.8,'CXX_STANDARD' 타겟 프로퍼티의 패밀리가 훨씬 길어졌고'cxx_std_YY' 메타 기능만으로 컴파일러 확장을 사용할 수 있는지 여부를 제어하지 않습니다. –

+1

@einpoklum 답변에 사용 된 바와 같이 _build requirements_는 대상 자체를 구축하는 데 필요한 것을 말하며 _usage requirements_는 대상과 연결된 모든 것이 요구 사항으로 상속되는 것입니다. –