tutorial gui course c++ cmake visual-studio-2017 c++17

gui - Cómo habilitar/std: c++ 17 en VS2017 con CMake



cmake tutorial (2)

Las versiones de CMake superiores a 3.10 son gitlab.kitware.com/cmake/cmake/issues/16482 para las versiones de MSVC más recientes que 19.0.24215. Si alguno de los requisitos de la versión no se cumple, entonces no tienen efecto.

El único enfoque portátil, para asegurar que su programa se compile con el modo estándar de C ++ correcto en Visual Studio, es requerir al menos CMake 3.10, establecer la propiedad de destino CXX_STANDARD a su valor deseado y CXX_STANDARD_REQUIRED en ON .

Ejemplo de uso:

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

Estoy intentando agregar la marca del compilador /std:c++17 a VS2017 con CMake. Estoy usando la forma multiplataforma "moderna" hasta ahora:

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})

Esto agrega /std:c++14 en VS2017 (¿cuál podría ser el predeterminado de todos modos?). Sin embargo, estoy teniendo problemas para cambiar esto a C ++ 17 (es decir, tener que agregar /std:c++17 ). Si simplemente lo agrego manualmente, recibo una advertencia no muy agradable porque ambas marcas están presentes:

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

He intentado set(CMAKE_CXX_STANDARD 17) pero no tiene ningún efecto, de hecho, la documentación de CMake menciona que CMAKE_CXX_STANDARD no tiene ningún efecto en VS de todos modos.

En cuanto a la adición de una característica de C ++ 17 a las características_objeto_objetivo, no parece que haya ninguna todavía (incluso en CMake-3.9.0-rc5), e incluso si las hubiera, específicamente estoy usando std::optional de C ++ 17, y no hay indicadores target_compile_features para funciones de biblioteca como std::optional .

Así que mi pregunta es, ¿cuál es la mejor (o menos fea) forma de hacer esto con CMake? ¿Y en cierto modo también funcionará para gcc y clang? Estoy feliz de usar una versión CMake muy reciente (3.8 o 3.9). Prefiero que sea "agradable" y no en bucle manual a través de CXX_COMPILE_FLAGS y eliminando la cadena "/ std: c ++ 14" o algún truco como ese.

( Edición : también puede ser el /std:c++latest modificador de VS /std:c++latest , lo que sea posible. Ambos funcionan para este propósito).


Convertir mi comentario en una respuesta.

  1. El equipo de CMake está trabajando en ello para VS2017 (a partir de julio de 2017, para la próxima versión de CMake 3.10):

    gitlab.kitware.com/cmake/cmake/issues/16482

    Esas banderas parecen ser cambios bastante nuevos (en relación con la fecha de esta pregunta):

    La versión preliminar de VS 2017 15.3 ahora es compatible con / std: c ++ 17

    Por lo tanto, para Visual Studio, tiene que "manualmente" reemplazar o agregar los conmutadores del compilador hasta que CMake lo soporte oficialmente.

    Aquí hay un fragmento de código que he probado para std:c++latest (que ya es compatible, por ejemplo, en mi versión CMake 3.8.0):

    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. Para CLang y GNU, el soporte se fusionó con la rama principal del código fuente a partir de 2017 y es parte de CMake versión 3.8 y superior:

    CMake: Características: Agregue soporte para el estándar de lenguaje C ++ 17