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..)
Siehe https://gitlab.kitware.com/cmake/cmake/issues/16482 ist diese Arbeit im Gange. – Florian
Update: 'CMAKE_CXX_STANDARD 17' ist nun in der letzten CMake-Nacht möglich und landet in CMake-3.10. – Ela782