c++ cmake c++14 gcc4

¿Cómo hacer que CMake pase std=c++ 14/c++ 1y o c++ 17/c++ 1z basado en la versión GCC?



c++14 gcc4 (3)

GCC 4.x no acepta el --std=c++14 para el código C ++ 14, sino que toma --std=c++1y . Las versiones posteriores toman --std=c++1z pero (probablemente) no --std=c++17 que aún no se ha establecido (escribiendo esto en 2016). Quizás hay problemas similares con C ++ 11.

¿Tiene CMake alguna facilidad (tal vez como un módulo) para pasar el interruptor correcto de acuerdo con la versión GCC?


Compruebe si el compilador soporta las banderas? Tal vez algo como

include(CheckCXXCompilerFlag) # Check for standard to use check_cxx_compiler_flag(-std=c++17 HAVE_FLAG_STD_CXX17) if(HAVE_FLAG_STD_CXX17) # Have -std=c++17, use it else() check_cxx_compiler_flag(-std=c++1z HAVE_FLAG_STD_CXX1Z) if(HAVE_FLAG_STD_CXX1Z) # Have -std=c++1z, use it else() # And so on and on... endif() endif()


Cuando desee especificar una versión particular de C ++, la forma recomendada de hacer esto con CMake 3.1 y CXX_STANDARD posteriores es usar las propiedades de destino CXX_STANDARD , CXX_STANDARD_REQUIRED y CXX_EXTENSIONS , o sus equivalentes variables para especificar los valores predeterminados de destino. Los detalles completos se pueden encontrar here , pero la versión corta dice algo como esto:

cmake_minimum_required(VERSION 3.1) project(Example) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # ... Define targets, etc. as usual

A continuación, CMake debe seleccionar el indicador de compilador apropiado para el estándar de C ++ solicitado en función de lo que el compilador admite, o error si no es compatible con el estándar solicitado.

También se debe tener en cuenta que CMake puede actualizar el destino para utilizar un estándar de idioma posterior al especificado por su propiedad de destino CXX_STANDARD . El uso de los requisitos de la función de compilación (como se menciona en la respuesta de @FlorianWolters) puede elevar el requisito del estándar de idioma. De hecho, CMake siempre elegirá el requisito de lenguaje más fuerte especificado por la propiedad de destino CXX_STANDARD o los requisitos de función de compilación establecidos en el destino. Tenga en cuenta también que la documentación de CMake a partir de 3.10.1 no refleja con precisión la forma en que CXX_EXTENSIONS interactúa con las características de compilación, ya que CXX_EXTENSIONS solo surte efecto si CXX_STANDARD también se especifica para los compiladores más comunes (ya que se especifican junto con el único indicador del compilador).


El código moderno de CMake debe usar el comando target_compile_features para solicitar un estándar C ++ específico. Esto se puede especificar como solo requisito de compilación ( PRIVATE ), solo requisito de uso ( INTERFACE ) o requisito de compilación y uso ( PUBLIC ).

Ejemplo:

cmake_minimum_required(VERSION 3.9.4) project(cpp-snippets) add_executable(cpp-snippets "main.cpp") target_compile_features(cpp-snippets PRIVATE cxx_std_17)

Consulte la sección Requerir estándares de idiomas en la documentación oficial de CMake para conocer las características de compilación de cmake para obtener más información.