132 votes

Comment activer le C++17 CMake

J'utilise VS 15,3, qui prend en charge intégrée de CMake 3.8. Comment puis-je la cible C++17 sans écrire de drapeaux pour chaque compilateurs? Mes paramètres globaux 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 à CMake pour ajouter "/std:c++dernière" ou de son équivalent lors de la génération VS fichiers de solution, mais pas de c++17 drapeaux a été trouvé, a entraîné d'erreur du compilateur:

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

81voto

nbout Points 58

Moderne CMake proposer une interface pour cela target_compile_features. La Documentation est ici: Exigeant des Normes Linguistiques

L'utiliser comme ceci:

target_compile_features(${TARGET_NAME} PRIVATE cxx_std_17)

48voto

Joachim Pileborg Points 121221

À partir de la CMake 3.9 documentation:

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

En bref, CMake n'ont pas été mis à jour pour tenir compte de la norme drapeaux ajouté à VC++ 2017.

Vous avez pour détecter si VC++ 2017 (ou version ultérieure) est utilisé et ajouter les codes correspondant vous-même pour l'instant.


Dans CMake 3.10 (et plus tard) ont été fixés pour une version plus récente de VC++. Voir l'article 3.10 de la documentation.

34voto

loneraver Points 264

Moderne CMake, j'ai trouvé qu'il est préférable d'attribuer CXX normes au niveau de la cible au lieu de la variable globale du niveau et de l'utilisation de la construction dans les propriétés (vu ici: https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html) afin de la garder compilateur agnostique.

Par Exemple:

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

30voto

Vous pouvez garder cette set(CMAKE_CXX_STANDARD 17) pour les autres compilateurs, comme Clang et de la GCC. Mais pour Visual Studio, c'est inutile.

Si CMake n'est toujours pas en charge cette fonction, vous pouvez effectuer les opérations suivantes:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X