Tengo una aplicación bastante grande configurada en cmake. Recientemente agregué un par de clases que utilizan la funcionalidad C++ 0x, y rompe la compilación, ya que cmake no está configurado para compilar con compatibilidad con C++ 0x. ¿Cómo lo agrego como una opción para cmake?agregar soporte C++ 0x en cmake
Respuesta
Es necesario añadir la bandera a CMAKE_CXX_FLAGS
:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
utilizo este fragmento de gcc, pero es una forma más complicada
if(CMAKE_COMPILER_IS_GNUCXX)
SET(ENABLE_CXX11 "-std=c++11")
EXECUTE_PROCESS(COMMAND "${CMAKE_CXX_COMPILER} -dumpversion" OUTPUT_VARIABLE GCC_VERSION)
if (GCC_VERSION VERSION_LESS 4.7)
SET(ENABLE_CXX11 "-std=c++0x")
endif()
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ENABLE_CXX11}")
endif()
tengo el siguiente módulo:
$ cat FindCXX11.cmake
# - Finds if the compiler has C++11 support
# This module can be used to detect compiler flags for using C++11, and checks
# a small subset of the language.
#
# The following variables are set:
# CXX11_FLAGS - flags to add to the CXX compiler for C++11 support
# CXX11_FOUND - true if the compiler supports C++11
#
# TODO: When compilers starts implementing the whole C++11, check the full set
include(CheckCXXSourceCompiles)
include(FindPackageHandleStandardArgs)
set(CXX11_FLAG_CANDIDATES
#Gnu and Intel Linux
"-std=c++0x"
#Microsoft Visual Studio, and everything that automatically accepts C++11
" "
#Intel windows
"/Qstd=c++0x"
)
set(CXX11_TEST_SOURCE
"
class Matrix
{
public:
Matrix(int a, int b, int c, int d)
: data {a, b, c, d}
{}
private:
int data[4];
};
int main()
{
int n[] {4,7,6,1,2};
for (auto i : n)
Matrix mat (3,5,1,2);
return 0;
}
")
foreach(FLAG ${CXX11_FLAG_CANDIDATES})
set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
set(CMAKE_REQUIRED_FLAGS "${FLAG}")
unset(CXX11_FLAG_DETECTED CACHE)
message(STATUS "Try C++11 flag = [${FLAG}]")
check_cxx_source_compiles("${CXX11_TEST_SOURCE}" CXX11_FLAG_DETECTED)
set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")
if(CXX11_FLAG_DETECTED)
set(CXX11_FLAGS_INTERNAL "${FLAG}")
break()
endif(CXX11_FLAG_DETECTED)
endforeach(FLAG ${CXX11_FLAG_CANDIDATES})
set(CXX11_FLAGS "${CXX11_FLAGS_INTERNAL}")
find_package_handle_standard_args(CXX11 DEFAULT_MSG CXX11_FLAGS)
mark_as_advanced(CXX11_FLAGS)
Utilizo esto para verificar si el subconjunto de C++ 11 estoy usando (en realidad esto es redundante ahora, ya que soy tú cantar mucho más), es compatible con el compilador. Es fácil desarrollar esto más y agregar más características, y agregar otros modificadores de compilación. En realidad, los únicos compiladores que he encontrado hasta ahora que pasan esta prueba son gcc> = 4.6 y clang> = 3.1 si no recuerdo mal.
Como se muestra en this answer, es mejor usar target_compile_features
para requerir soporte para las funciones específicas que necesita.
Esto explica/documenta mejor qué funcionalidad requiere su código, es compatible multiplataforma y dará al usuario un mensaje de error más útil si la característica requerida no está disponible en su compilador.
Desde el manual page para esta opción:
target_compile_features
Add esperada características del compilador a un objetivo.
target_compile_features(<target> <PRIVATE|PUBLIC|INTERFACE> <feature> [...])
Especifique las características del compilador necesarias al compilar un objetivo determinado. Si la función no figura en la variable CMAKE_C_COMPILE_FEATURES ni en la variable CMAKE_CXX_COMPILE_FEATURES, se informará un error por CMake. Si el uso de la función requiere un indicador de compilación adicional, como
-std=gnu++11
, la bandera se agregará automáticamente.
La lista (con suerte completa) de características que se pueden probar con esta macro es here.
- 1. Soporte Unicode en C++ 0x
- 2. CMake clang y C++ 0x
- 3. Soporte de Cmake en Eclipse
- 4. ¿Cómo construir Boost con soporte C++ 0x?
- 5. ¿Hay alguna actualización del soporte de localización en C++ 0x?
- 6. Usando C++ 0x en el proyecto Xcode 4.2 a través de CMake
- 7. ¿Cómo habilitar las características de C++ 0x en Visual Studio? [Soporte de listas de inicializadores]
- 8. ¿Es probable que algún compilador mainstream soporte C++ 0x unrestricted unions en el futuro cercano?
- 9. función "id" en C++ 0x
- 10. Usando __thread en C++ 0x
- 11. Agregar archivos a source_group en CMake
- 12. ¿Planes de biblioteca para C++ 0x?
- 13. C++ 0x lambda capturas
- 14. C++ 0x: Memoria ordenar
- 15. C++ 0x sobrecarga Lambda
- 16. C + + 0x subprocesamiento
- 17. C++ 0x - ¿Cuándo?
- 18. ¿Qué compilador (es) tiene el soporte más avanzado para el estado actual de C++ 0x?
- 19. compatibilidad con especificaciones g ++ y C++ 0x
- 20. ¿Utiliza el modo C++ 0x de GCC en producción?
- 21. C++/CLI y CMake
- 22. Cómo agregar la definición de macro en cmake?
- 23. Establecer ruta en CMake (C++, ImageMagick)
- 24. No hay secuencias Unicode en C++ 0x? ¿Por qué?
- 25. C++ 0x con Qt Creator
- 26. C++ 0x interrupción de hilo
- 27. función asíncrona llamada C++ 0x
- 28. Usando unordered_map de C++ 0x
- 29. constructores La herencia en C++ 0x
- 30. C++ 0x Constructor Peer en VC2010
Si está utilizando un compilador más nuevo, debe usar '-std = C++ 11' en su lugar. Ya no es un borrador. –