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)