web-dev-qa-db-fra.com

Comment activer / std: c ++ 17 dans VS2017 avec CMake

J'essaie d'ajouter l'indicateur du compilateur /std:c++17 À VS2017 avec CMake. J'utilise jusqu'à présent la méthode multiplateforme "moderne":

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) # -std=c++11 instead of -std=gnu++11
set(MY_CXX_COMPILE_FEATURES cxx_generic_lambdas cxx_range_for cxx_strong_enums)

add_library(mylib INTERFACE)
target_compile_features(mylib INTERFACE ${MY_CXX_COMPILE_FEATURES})

Cela ajoute /std:c++14 Dans VS2017 (qui pourrait être la valeur par défaut de toute façon?). Cependant, j'ai du mal à passer à C++ 17 (c'est-à-dire à ajouter /std:c++17). Si je viens de l'ajouter manuellement, j'obtiens l'avertissement pas si sympa car les deux drapeaux sont présents:

1>cl : Command line warning D9025: overriding '/std:c++14' with '/std:c++17'

J'ai essayé set(CMAKE_CXX_STANDARD 17) mais cela n'a aucun effet, en fait la documentation de CMake mentionne que CMAKE_CXX_STANDARD N'a de toute façon aucun effet sur VS.

Quant à l'ajout d'une fonctionnalité C++ 17 à target_compile_features, Il ne semble pas qu'il y en ait encore (même dans CMake-3.9.0-rc5), et même s'il y en avait, je ne suis spécifiquement que en utilisant std::optional à partir de C++ 17, et il n'y a pas d'indicateur target_compile_features pour les fonctionnalités de bibliothèque comme std::optional.

Donc ma question est, quelle est la meilleure (ou la moins laide) façon de faire ça avec CMake? Et d'une certaine manière, cela fonctionnera également pour gcc et clang? Je suis heureux d'utiliser une version très récente de CMake (3.8 ou 3.9). Je préfère que ce soit "Nice" et ne pas parcourir manuellement CXX_COMPILE_FLAGS et supprimer la chaîne "/ std: c ++ 14" ou un hack comme ça.

( Edit : Il peut également s'agir du commutateur VS /std:c++latest - selon ce qui est possible. Les deux fonctionnent dans ce but.)

28
Ela782

Transformer mon commentaire en réponse

  1. L'équipe CMake y travaille pour VS2017 (comme en juillet 2017, pour la prochaine version 3.10 de CMake):

    CMake: commutateurs de version standard MSVC

    Ces drapeaux semblent être des commutateurs plutôt nouveaux (par rapport à la date de cette question):

    L'aperçu de VS 2017 15.3 prend désormais en charge/std: c ++ 17

    Donc, pour Visual Studio, vous devez remplacer ou ajouter "manuellement" les commutateurs du compilateur jusqu'à ce que CMake le prenne officiellement en charge.

    Voici un extrait de code que j'ai testé pour std:c++latest (qui est déjà pris en charge par exemple dans ma version CMake 3.8.0):

    if (MSVC_VERSION GREATER_EQUAL "1900")
        include(CheckCXXCompilerFlag)
        CHECK_CXX_COMPILER_FLAG("/std:c++latest" _cpp_latest_flag_supported)
        if (_cpp_latest_flag_supported)
            add_compile_options("/std:c++latest")
        endif()
    endif()
    
  2. Pour CLang et GNU le support a été fusionné dans la branche principale du code source début 2017 et fait partie de CMake version 3.8 et supérieure:

    CMake: Fonctionnalités: Ajout de la prise en charge du langage standard C++ 17

20
Florian

Versions CMake supérieures à 3.10 prise en charge des commutateurs standard MSVC C++ pour les versions MSVC plus récentes que 19.0.24215. Si l'une des exigences de version n'est pas remplie, elles n'ont aucun effet.

La seule approche portable, pour vous assurer que votre programme est compilé avec le mode standard C++ correct sur Visual Studio, est d'exiger au moins CMake 3.10, définissez la propriété cible CXX_STANDARD à la valeur souhaitée et CXX_STANDARD_REQUIRED à ON.

Exemple d'utilisation:

set_property(TARGET my_target PROPERTY CXX_STANDARD 17)
set_property(TARGET my_target PROPERTY CXX_STANDARD_REQUIRED ON)
15
tambre