Я пытаюсь добавить флаг компилятора /std:c++17
в VS2017 с помощью 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})
Это добавляет /std:c++14
в VS2017 (который по умолчанию может быть по умолчанию?).
Однако мне не удается переключить это на С++ 17 (т.е. Добавить /std:c++17
). Если я просто добавлю его вручную, я получаю предупреждение не очень хорошо, потому что присутствуют оба флага:
1>cl : Command line warning D9025: overriding '/std:c++14' with '/std:c++17'
Я пробовал set(CMAKE_CXX_STANDARD 17)
, но это не имеет никакого эффекта, на самом деле документация CMake указывает, что CMAKE_CXX_STANDARD
никак не влияет на VS.
Что касается добавления функции С++ 17 в target_compile_features
, похоже, что пока нет (даже в CMake-3.9.0-rc5), и даже если бы это было так, я был конкретно используя std::optional
из С++ 17, и там нет флагов target_compile_features
для библиотечных функций, таких как std::optional
.
Итак, мой вопрос: какой лучший (или наименее уродливый) способ сделать это с помощью CMake? И таким образом, он также будет работать на gcc и clang? Я рад использовать очень недавнюю версию CMake (3.8 или 3.9). Я предпочитаю, чтобы он был "приятным", а не ручным циклом через CXX_COMPILE_FLAGS и удалением строки "/std: С++ 14" или некоторым взломом.
(Edit: также может быть переключатель VS /std:c++latest
- в зависимости от того, что возможно. Оба работают для этой цели.)