what tutorial script course c++ visual-studio cmake c++17

c++ - course - cmake script tutorial



Cómo habilitar C++ 17 en CMake (4)

De la documentación de CMake 3.9 :

Para los compiladores que no tienen noción de un nivel estándar, como MSVC, esto no tiene ningún efecto.

En resumen, CMake no se ha actualizado para adaptarse a las marcas estándar agregadas a VC ++ 2017.

Debe detectar si se usa VC ++ 2017 (o posterior) y agregar las marcas correspondientes por el momento.

En CMake 3.10 (y más tarde) esto se ha corregido para la versión más reciente de VC ++. Consulte la documentación 3.10 .

Estoy usando VS 15.3, que es compatible con CMake 3.8 integrado. ¿Cómo puedo apuntar a C ++ 17 sin escribir indicadores para cada compilador específico? Mi configuración global actual no funciona:

# 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")

Esperé que CMake agregara "/ std: c ++ lastest" o equivalentes al generar archivos de solución VS, pero no se encontraron marcas de c ++ 17, lo que produjo un error del compilador:

C1189 #error: class template optional is only available with C++17.


En el moderno CMake, he encontrado que es mejor asignar los estándares de CXX al nivel objetivo en lugar del nivel de variable global y usar las propiedades integradas (se puede ver aquí: https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html ) para mantener el compilador agnóstico.

Por ejemplo:

set_target_properties(FooTarget PROPERTIES CXX_STANDARD 17 CXX_EXTENSIONS OFF etc.. )


Modern CMake propone una interfaz para este propósito target_compile_features . La documentación está aquí: Exigir estándares de idioma

Úsalo así:

target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)


Puedes mantener ese set(CMAKE_CXX_STANDARD 17) para otros compiladores, como Clang y GCC. Pero para Visual Studio, es inútil.

Si CMake aún no admite esto, puedes hacer lo siguiente:

if(MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17") endif(MSVC)