webentwicklung-frage-antwort-db.com.de

So aktivieren Sie / std: c ++ 17 in VS2017 mit CMake

Ich versuche, VS2017 mit CMake das Compiler-Flag /std:c++17 Hinzuzufügen. Ich benutze bisher den "modernen" Cross-Plattform-Weg:

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 hinzu (was könnte die Standardeinstellung sein?). Allerdings habe ich Probleme, dies auf C++ 17 umzustellen (d. H. Es fügt /std:c++17 Hinzu). Wenn ich es nur manuell hinzufüge, erhalte ich die nicht so schöne Warnung, weil beide Flags vorhanden sind:

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

Ich habe set(CMAKE_CXX_STANDARD 17) ausprobiert, aber es hat keine Auswirkung. In der CMake-Dokumentation wird erwähnt, dass CMAKE_CXX_STANDARD Sowieso keine Auswirkung auf VS hat.

Was das Hinzufügen einer C++ 17-Funktion zu target_compile_features Angeht, scheint es noch keine zu geben (selbst in CMake-3.9.0-rc5), und selbst wenn ja, bin ich es nur Verwenden von std::optional aus C++ 17, und es gibt keine target_compile_features - Flags für Bibliotheksfunktionen wie std::optional.

Meine Frage ist also, 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 verwende gerne eine aktuelle CMake-Version (3.8 oder 3.9). Ich bevorzuge es, "Nice" zu sein und CXX_COMPILE_FLAGS nicht manuell zu durchlaufen und den String "/ std: c ++ 14" oder einen Hack wie diesen zu entfernen.

(Edit: Es kann auch der Schalter VS /std:c++latest Sein - je nachdem, was möglich ist. Beide funktionieren für den Zweck.)

28
Ela782

Aus meinem Kommentar eine Antwort machen

  1. Das CMake-Team arbeitet daran für VS2017 (Stand Juli 2017, kommende CMake-Version 3.10):

    CMake: MSVC-Standardversion wechselt

    Diese Flags scheinen eher neue Schalter zu sein (bezogen auf das Datum dieser Frage):

    Die Vorschau von VS 2017 15.3 unterstützt jetzt/std: c ++ 17

    Für Visual Studio müssen Sie also die Compiler-Schalter "manuell" ersetzen oder anhängen, bis CMake dies offiziell unterstützt.

    Hier ist ein Codeausschnitt, den ich auf std:c++latest Getestet habe (der beispielsweise in meiner CMake 3.8.0-Version bereits 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 CLang und GNU) wurde die Unterstützung Anfang 2017 in den Hauptquellcode-Zweig integriert und ist Teil von CMake Version 3.8 und höher:

    CMake: Features: Unterstützung für C++ 17 Sprachstandard hinzufügen

20
Florian

CMake-Versionen höher als 3.10 nterstützt MSVC C++ - Standard-Switches für MSVC-Versionen, die neuer als 19.0.24215 sind. Wenn eine der Versionsanforderungen nicht erfüllt ist, haben sie keine Auswirkung.

Der einzige tragbare Ansatz, um sicherzustellen, dass Ihr Programm mit dem richtigen C++ - Standardmodus in Visual Studio kompiliert wird, besteht darin, mindestens CMake 3.10 und die Zieleigenschaft CXX_STANDARD auf Ihren gewünschten Wert und CXX_STANDARD_REQUIRED bis ON.

Anwendungsbeispiel:

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