Ich verwende VS 15.3, das integrierte CMake 3.8 unterstützt. Wie kann ich C++ 17 ansprechen, ohne Flags für jeden bestimmten Compiler zu schreiben? Meine aktuellen globalen Einstellungen funktionieren nicht:
# https://cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.html
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# expected behaviour
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++lastest")
Ich habe erwartet, dass CMake beim Generieren von VS-Lösungsdateien "/ std: c ++ lastest" oder Äquivalente hinzufügt. Es wurden jedoch keine C++ 17-Flags gefunden, die zu einem Compiler-Fehler führten:
C1189 #error: class template optional is only available with C++17.
Aus der CMake 3.9 Dokumentation :
Für Compiler, die keine Vorstellung von einem Standard-Level wie MSVC haben, hat dies keine Auswirkungen.
Kurz gesagt, CMake wurde nicht aktualisiert, um die in VC++ 2017 hinzugefügten Standardflags aufzunehmen.
Sie müssen herausfinden, ob VC++ 2017 (oder später) verwendet wird, und die entsprechenden Flags selbst hinzufügen.
In CMake 3.10 (und höher) wurde dies für die neuere Version von VC++ behoben. Siehe die 3.10 Dokumentation .
In der modernen Version von CMake habe ich es am besten gefunden, CXX-Standards auf Zielebene statt auf Ebene der globalen Variablen festzulegen und die integrierten Eigenschaften zu verwenden (siehe hier: https://cmake.org/cmake/help/latest/manual) /cmake-properties.7.html ) um den Compiler agnostisch zu halten.
Zum Beispiel:
set_target_properties(FooTarget PROPERTIES
CXX_STANDARD 17
CXX_EXTENSIONS OFF
etc..
)
Sie können diese set(CMAKE_CXX_STANDARD 17)
für andere Compiler wie Clang und GCC behalten. Aber für Visual Studio ist es nutzlos.
Wenn CMake dies immer noch nicht unterstützt, können Sie Folgendes tun:
if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17")
endif(MSVC)
Modernes CMake schlägt eine Schnittstelle für diesen Zweck vor target_compile_features
. Die Dokumentation finden Sie hier: Sprachstandards erforderlich
Benutze es so:
target_compile_features(${TARGET_NAME} PRIVATE cxx_std_17)