2017-07-07 4 views
14

Ich versuche, die Compiler-Flag /std:c++17 VS2017 mit CMake hinzuzufügen. Ich bin mit dem "modernen" Cross-Plattform-Weg so weit:Wie zu aktivieren/Std: C++ 17 in VS2017 mit CMake

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}) 

Dies fügt /std:c++14 in VS2017 (die den Standard sein könnten sowieso?). Allerdings habe ich Probleme, dies zu C++ 17 zu wechseln (d. H. Es hinzufügen /std:c++17). Wenn ich es nur manuell hinzufügen, erhalte ich die nicht-so-nette Warnung, weil beide Flags vorhanden sind:

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

Ich habe versucht set(CMAKE_CXX_STANDARD 17) aber es hat keine Wirkung, in der Tat die CMake Dokumentation erwähnt, dass CMAKE_CXX_STANDARD hat keine Auswirkungen auf VS sowieso.

Wie zum Hinzufügen eines C++ 17-Feature zu target_compile_features, es scheint nicht, als gäbe es noch (es gibt auch in CMake-3.9.0-rc5), und selbst wenn es gab, verwende ich speziell nur std::optional von C++ 17, und es gibt keine target_compile_features Flags für Bibliothek Features wie std::optional.

Also meine Frage ist, was ist der beste (oder am wenigsten hässliche) Weg, dies mit CMake zu tun? Und in gewisser Weise funktioniert es auch für gcc und clang? Ich bin froh, eine sehr aktuelle CMake-Version (3.8 oder 3.9) zu verwenden. Ich bevorzuge es, "nett" zu sein und nicht manuell durch CXX_COMPILE_FLAGS zu laufen und den String "/ std: C++ 14" oder einen solchen Hack zu entfernen.

(bearbeiten: Es kann auch der VS /std:c++latest Schalter sein - je nachdem, was möglich ist Beide arbeiten für die Zwecke..)

+0

Siehe https://gitlab.kitware.com/cmake/cmake/issues/16482 ist diese Arbeit im Gange. – Florian

+0

Update: 'CMAKE_CXX_STANDARD 17' ist nun in der letzten CMake-Nacht möglich und landet in CMake-3.10. – Ela782

Antwort

15

Drehen meines Kommentars in einer Antwort

  1. Die CMake Team arbeitet daran für VS2017 (wie für Juli 2017, für kommende CMake Version 3.10):

    CMake: MSVC standard version switches

    Diese Fahnen zu sein scheinen eher neue Schalter (im Gegensatz zu dem Datum dieser Frage bezogen):

    VS 2017 15,3 Vorschau unterstützt jetzt/std: C++ 17

    Also für Visual Studio muss die Compiler-Switches "manuell" ersetzen oder anhängen, bis CMake es offiziell unterstützt.

    Hier ist ein Code-Snippet, das ich für std:c++latest getestet haben (die bereits zB in meiner CMake 3.8.0 Version unterstützt wird):

    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. Für Klirren und GNU die Unterstützung in den Haupt verschmolzen Quellcode Zweig 2017 beginnen und ist ein Teil von CMake Version 3.8 und höher:

    CMake: Features: Add support for C++ 17 language standard

+0

Hmm! Schade, dass es in CMake noch nicht gelandet ist, das Problem ist 7 Monate alt :-((Die Flags sind nicht wirklich zu neu, VS2015 hatte sie schon.) Wie auch immer. Gegeben bin ich über "modern" und zielbasiert Ansatz, was wäre der beste Weg, um das Flag für MSVC manuell zu ersetzen/hinzufügen? – Ela782

+0

Ich denke, das wird ein Kopfweh sein.Ich kann nicht get_target_property (my_compile_flags mylib COMPILE_FLAGS) ', weil es ein Interface-Ziel (nur Kopfzeile) ist Bibliothek) ... – Ela782

+0

Ich habe dies in einer neuen Frage gefragt: https://stackoverflow.com/questions/44977868/cmake-replace-compile-flags-of-an-interface-target – Ela782

3

CMake Versionen höher tha n 3.10 support MSVC C++ standard switches für MSVC-Versionen neuer als 19.0.24215. Wenn eine der Versionsanforderungen nicht erfüllt ist, haben sie keine Auswirkungen.

Der einzige tragbare Ansatz, um das Programm zu gewährleisten mit der richtigen C++ Standard-Modus auf Visual Studio kompiliert wird, stellen Sie die Zieleigenschaft CXX_STANDARD auf den gewünschten Wert und CXX_STANDARD_REQUIRED-ON mindestens CMake 3.10 verlangen ist.

Beispiel Nutzung:

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