2011-11-02 8 views
11

Tengo un proyecto configurado a través de Autoconf, y quiero comenzar a utilizar las características de C++ 11 en este proyecto. ¿Cómo se activa siempre el conmutador "-std = gnu ++ 0x" y se comprueba el soporte para las características durante la configuración?¿Cómo usar las características de C++ 11 con Autoconf?

+2

A menos que desee utilizar extensiones del CCG, el interruptor que desea utilizar es "-std = C++ 0x". –

+0

Esto se ha resuelto con una macro Autoconf aquí http://stackoverflow.com/questions/8585110/how-can-i-specify-that-i-want-c0x-in-makefile-am. La ventaja es que no fallará si no tiene compatibilidad con el compilador C++ 11, mientras que AC_CHECK_COMPILE_FLAG detendrá la construcción cuando falla. –

+0

¿Cómo puede ser esto un duplicado si se ha preguntado antes? – lvella

Respuesta

13

Usted puede hacer esto con algo como AX_CHECK_COMPILE_FLAG, por ejemplo:

AX_CHECK_COMPILE_FLAG([-std=c++0x], [ 
         CXXFLAGS="$CXXFLAGS -std=c++0x"]) 

(Necesita ser cuidadosos en este punto que AC_LANG es C++, no C en el punto esto se llama porque es posible utilizar gcc para C y algo más para C++ o viceversa).

+1

Esto probablemente no sea suficiente: si el compilador no admite -std == C++ 0x, entonces la configuración tendrá éxito pero la compilación fallará. –

+0

+1 sin embargo, dado que es bastante fácil agregar un tercer argumento con AC_MSG_ERROR –

+0

@WilliamPursell - lo más útil podría ser utilizar AC_DEFINE junto con esto para que la construcción aún pueda continuar, solo con diferentes implementaciones de algunas partes en exactamente de la misma forma en que manejo el 'snprintf' que falta en C hoy. Es posible que haya menos funciones expuestas o expuestas a través de una interfaz alternativa, pero probablemente no sea un obstáculo para mostrar en este punto. – Flexo

1

Para activar el interruptor del compilador (a menos que, por supuesto, el usuario los redefina), puso esto en su Makefile.am:

AM_CXXFLAGS=-std=c++0x 

No creo que hay un cheque disponible para la presencia de C++ 11 características, pero debería poder escribir un programa de prueba bastante fácilmente con las características que desea usar, que fallará si esas características no son compatibles. A continuación, puede escribir una prueba como se describe en this section of the Autoconf manual.

+1

Si la prueba fallará sin las características de C++ 11, la bandera deberá estar en CXXFLAGS o la configuración siempre fallará. –

4

Creo que la forma más sencilla de hacer esto es agregar:

 
CXXFLAGS="$CXXFLAGS -std=c++0x" 

en configure.ac antes AC_PROG_CXX. Si el compilador no acepta -std = C++ 0x, entonces la configuración fallará con "el compilador de C++ no puede crear ejecutables". No es el mejor mensaje de error, pero asegura que las construcciones tendrán éxito si la configuración tiene éxito. Para un mejor mensaje de error, puede verificar que el compilador acepte el indicador después de AC_PROG_CXX. En cualquier caso, quiere que configure falle si el compilador no proporciona las características necesarias, pero su software lo requiere.

Tenga en cuenta que establecer CXXFLAGS antes que AC_PROG_CXX tiene el efecto secundario indeseable de evitar la configuración predeterminada para CXXFLAGS en el caso de que el usuario no establezca esa variable al ejecutar configure. Por esta razón, normalmente no se recomienda configurar CXXFLAGS en la configuración, por lo que probablemente sea mejor verificar la bandera después de AC_PROG_CXX (por ejemplo, usando la solución de awoodland); solo asegúrese de agregar un AC_MSG_ERROR en el tercer argumento de AX_CHECK_COMPILE_FLAG para que configure falla si las características no están disponibles.

17

¿Has visto ax_cxx_compile_stdcxx_11?

Creo que esto es exactamente lo que quiere.

Hay una gran biblioteca de macros en gnu website.

+4

Probablemente esta sea la solución correcta. La gente simplemente debe recordar instalar el paquete de archivo 'autoconf-archive' en Debian, y ejecutar' aclocal' antes de ejecutar 'autoconf' (para extraer las macros requeridas en' aclocal.m4'). – carandraug

+0

Esta es una solución mejor que la mía, que no existía cuando originalmente respondí esta pregunta. – Flexo

+0

@carandraug Le agradecería si usted o el OP pudieran deletrear más detalles. ¿Cuál es la instalación correcta y la sintaxis para usar? Antes de instalar autoconf-archive siempre obtenía un error de sintaxis (no un error "no encontrado") en la llamada en configure.ac. Después de instalar autoconf-archive obtengo "error de sintaxis: token casi inesperado" ac_config_headers = "$ ac_config_headers config.h" ' – garyp

Cuestiones relacionadas