Lorsque l'on souhaite spécifier une version particulière de C++, la manière recommandée de le faire avec CMake 3.1 et les versions ultérieures est d'utiliser la commande CXX_STANDARD
, CXX_STANDARD_REQUIRED
et CXX_EXTENSIONS
propriétés de la cible, ou leurs équivalents variables pour spécifier les valeurs par défaut de la cible. Des détails complets peuvent être trouvés ici mais la version courte est quelque chose comme ça :
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 devrait alors sélectionner le drapeau de compilateur approprié pour le standard C++ demandé en fonction de ce que le compilateur supporte, ou se tromper s'il ne supporte pas le standard demandé.
Il convient également de noter que CMake peut mettre à niveau la cible pour utiliser un standard de langage plus récent que celui spécifié par son fichier CXX_STANDARD
la propriété de la cible. L'utilisation de compiler les exigences relatives aux fonctionnalités (comme mentionné dans la réponse de @FlorianWolters) peut augmenter l'exigence du standard de langue. En fait, CMake choisira toujours l'exigence de langage la plus forte spécifiée par l'une ou l'autre des options suivantes CXX_STANDARD
ou les exigences de la fonction de compilation définies sur la cible. Notez également que la documentation de CMake, à partir de la version 3.10.1, ne reflète pas exactement la façon dont les propriétés de la cible sont définies. CXX_EXTENSIONS
interagit avec les fonctions de compilation, comme CXX_EXTENSIONS
ne prend effet que si CXX_STANDARD
est également spécifié pour les compilateurs les plus courants (puisqu'ils sont spécifiés ensemble avec l'indicateur de compilateur unique).
1 votes
"Peut-être y a-t-il des problèmes similaires avec C++11." Ce serait c++11 contre c++0x, le premier ayant été introduit dans gcc4.7/8 environ.
1 votes
En fait, les anciens commutateurs (0x, 1y, 1z) fonctionnent très bien même sur les compilateurs qui supportent les modernes, il n'y a donc pas de réel besoin de faire ça "bien".
3 votes
Il y a est Il faut que cela soit "correct" car passer les drapeaux bruts du compilateur est un anti-modèle de CMake et va à l'encontre de tout le concept d'un système de méta-construction/générateur de système de construction.