it-swarm.com.de

So aktivieren Sie C++ 17 in CMake

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.
21
MiP

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 .

20

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..
            )
9
loneraver

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)

5
nbout