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.
À 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 .
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..
)
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)