2017-08-15 44 views
9

Używam VS 15.3, który obsługuje zintegrowany CMake 3.8. Jak mogę celować w C++ 17 bez pisania flag dla poszczególnych kompilatorów? Moje obecne ustawienia globalne nie działają:Jak włączyć C++ 17 w CMake

# https://cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.html 
set(CMAKE_CXX_STANDARD 17) 
set(CMAKE_CXX_STANDARD_REQUIRED ON) 
set(CMAKE_CXX_EXTENSIONS OFF) 

# expected behaviour 
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++lastest") 

Spodziewałem CUpewnij dodać „/ C++ std Ostatnia” lub odpowiedniki podczas generowania plików rozwiązania VS, ale nie C++ 17 flagi stwierdzono, spowodowało błąd kompilatora:

C1189 #error: class template optional is only available with C++17. 
+1

CUpewnij w ogóle nie eliminuje potrzebę napisania flagi dla każdego konkretnego kompilatora. – VTT

+1

W "VS 15.3" masz na myśli Visual Studio 2017 w wersji 3? Czy masz na myśli Visual Studio 2015 aktualizacja 3 (która nie obsługuje wiele, jeśli w ogóle, C++ 17)? –

+0

@Someprogrammerdude Używam funkcji 'std :: optional', które można użyć, jeśli ręcznie dodam flagę"/std: C++ lastest "' do CMakeLists. – MiP

Odpowiedz

6

Z CMake 3.9 documentation:

For compilers that have no notion of a standard level, such as MSVC, this has no effect.

w skrócie, CUpewnij nie zostały uaktualnione w celu dostosowania dla standardowe flagi dodane do VC++ 2017.

Musisz wykryć, czy VC++ 2017 (lub nowszy) jest używany i dodać odpowiednie flagi na razie.


W CMake 3.10 (i nowszych) zostało to poprawione dla nowszej wersji VC++. Zobacz the 3.10 documentation.

+2

Nowsza dokumentacja CMake 3.10 (i nowsze) mówi, że działa dla Visual Studio 2015 aktualizacja 3 lub nowsza. Tylko wersje Visual Studio przed 2015 Update 3 nie są obsługiwane. Powyższy link trafia do najnowszej dokumentacji, co odzwierciedla to. – Marcus10110

+1

@ Marcus10110 Poprawiono, zmieniono link, wskazując na dokumentację 3.9. I dodał notatkę o tym, że został naprawiony dla nowszych wersji. Dzięki. –

2

Możesz zachować że set(CMAKE_CXX_STANDARD 17) innych kompilatorów, jak Clang i GCC. Ale dla Visual Studio jest bezużyteczne.

Jeśli CUpewnij nadal nie obsługuje tej funkcji, można wykonać następujące czynności:

if(MSVC) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17") 
endif(MSVC) 
+1

[Ostatnie zmiany VS] (https://docs.microsoft.com/en-us/cpp/what-s-new-for-visual-cpp -in-visual-studio) pozwalają ustawić standard używając flag '/ std: C++ 14','/std: C++ 17' i '/ std: C++ latest'. – VTT

+0

@VTT Oh! Poprawiono mnie! –

1

W nowoczesnym CMake, uznałem, że najlepiej jest przypisać standardy CXX na poziomie docelowym zamiast globalnego poziomu zmiennych i użyć wbudowanych właściwości (patrz tutaj: https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html), aby zachować agnostykę kompilatora.

Dla przykładu:

set_target_properties(FooTarget PROPERTIES 
      CXX_STANDARD_REQUIRED 17 
      CXX_EXTENSIONS OFF 
      etc.. 
      )