CMake 3.1 introdujo la variable CMAKE_CXX_STANDARD que puede usar. Si sabe que siempre tendrá CMake 3.1 disponible, puede escribir esto en su archivo CMakeLists.txt de nivel superior, o ponerlo justo antes de definir un nuevo objetivo:
set (CMAKE_CXX_STANDARD 11)
Si necesita admitir versiones anteriores de CMake, aquí hay una macro que se me ocurrió que puede usar:
macro(use_cxx11)
if (CMAKE_VERSION VERSION_LESS "3.1")
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
endif ()
else ()
set (CMAKE_CXX_STANDARD 11)
endif ()
endmacro(use_cxx11)
La macro solo es compatible con GCC en este momento, pero debería ser sencillo expandirla a otros compiladores.
Luego, podría escribir use_cxx11()
en la parte superior de cualquier archivo CMakeLists.txt que defina un destino que use C ++ 11.
CMake problema # 15943 para usuarios clang dirigidos a macOS
Si está utilizando CMake y clang para apuntar a macOS, hay un error que puede hacer que la CMAKE_CXX_STANDARD
función simplemente no funcione (no agregue ningún indicador del compilador). Asegúrese de hacer una de las siguientes cosas:
- Utilice cmake_minimum_required para requerir CMake 3.0 o posterior, o
Establezca la política CMP0025 en NUEVO con el siguiente código en la parte superior de su archivo CMakeLists.txt antes del project
comando:
# Fix behavior of CMAKE_CXX_STANDARD when targeting macOS.
if (POLICY CMP0025)
cmake_policy(SET CMP0025 NEW)
endif ()
SET(CMAKE_CXX_FLAGS "-std=c++0x")
bien funciona para mí, por lo que es probablemente un problema en otro lugar en el archivo CMakeLists. Asegúrese de no sobrescribir accidentalmente el contenido de CMAKE_CXX_FLAGS más adelante.set(CMAKE_CXX_STANDARD 11)
(antes de definir el objetivo) es la mejor manera.CXX_STANDARD
lo hace no trabajo en MSVC, así que básicamente tiene que caer de nuevo atarget_compile_features
si quieres algo que funciona multiplataforma.