web-dev-qa-db-fra.com

Comment activer C++ 17 dans CMake

J'utilise VS 15.3, qui prend en charge intégré CMake 3.8. Comment puis-je cibler C++ 17 sans écrire d'indicateurs pour chaque compilateur spécifique? Mes paramètres globaux actuels ne fonctionnent pas:

# 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")

Je m'attendais à ce que CMake ajoute "/ std: c ++ lastest" ou des équivalents lors de la génération de fichiers de solution VS, mais aucun indicateur c ++ 17 n'a été trouvé, ce qui a entraîné une erreur du compilateur:

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

À partir de CMake 3.9 documentation :

Pour les compilateurs qui n'ont aucune notion de niveau standard, tel que MSVC, cela n'a aucun effet.

En bref, CMake n'a pas été mis à jour pour prendre en charge les indicateurs standard ajoutés à VC++ 2017.

Vous devez détecter si VC++ 2017 (ou une version ultérieure) est utilisé et ajouter vous-même les indicateurs correspondants pour le moment.


Dans CMake 3.10 (et versions ultérieures), cela a été corrigé pour la version plus récente de VC++. Voir la documentation 3.10 .

20

Dans CMake moderne, il est préférable d’affecter les normes CXX au niveau cible au lieu du niveau variable global et d’utiliser les propriétés intégrées (voir ici: https://cmake.org/cmake/help/latest/manual /cmake-properties.7.html ) pour le garder agnostique pour le compilateur.

Par exemple:

set_target_properties(FooTarget PROPERTIES
            CXX_STANDARD 17
            CXX_EXTENSIONS OFF
            etc..
            )
9
loneraver

Vous pouvez conserver ce set(CMAKE_CXX_STANDARD 17) pour d’autres compilateurs, tels que Clang et GCC. Mais pour Visual Studio, c'est inutile.

Si CMake ne supporte toujours pas cela, vous pouvez faire ce qui suit:

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