2012-05-18 14 views
11

Estoy intentando construir Boost 1.49.0 usando GCC 4.7.0 (MinGW). Sigo recibiendo el mensaje de error varias docenas de veces:Error al generar Boost 1.49.0 con GCC 4.7.0

c:\tools\mingw\bin../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/c++/4.7.0/cmath:1096:11: error: '::hypot' has not been declared

Línea 1096 de cmath contiene

using ::hypot; 

cmath incluye math.h que declara la función hypot como

extern double __cdecl hypot (double, double); /* in libmoldname.a */ 

En ambos archivos, un par de líneas después de las citadas anteriormente, son declaraciones idénticas para elFunción(excepto el tipo es long double en lugar de double) y que parece feliz.

¿Alguna idea de por qué me sale este error?

Respuesta

12

Encontré la respuesta en this forum post. Parece que pyconfig.h tiene las siguientes líneas:

#if defined(__GNUC__) && defined(_WIN32) 
// ... 
#define hypot _hypot 
// ... 
#endif /* GNUC */ 

pero cmath incluido con MinGW espera que la función que se llamará hypot y no _hypot, lo que hace que los errores de compilación.

La solución fue la de incluir lo siguiente para CXXFLAGS de mi línea de comandos bjam opción

bjam ... cxxflags="-include cmath " 

Esto indica que g ++ debe incluir la cabeceracmath al comienzo de cada archivo de origen.

+0

Gracias, eso hizo el truco! – Mercyful

0

Intente mirar la unidad preprocesada. Supongo que encontrarás algo como "#undef hypot".

3

Por lo que puedo ver, esto ocurre al compilar con MingW, usando -std = C++ 0xx, e incluyendo Python.h antes de cmath. Y tenga en cuenta que cmath está incluido en bastantes otros archivos de encabezado ... Tenga en cuenta que el problema no es específico de Boost. Un hecho que complica la situación es que en mi configuración estándar de compilación cruzada de MingW-Visual Studio, Visual Studio 2010 necesita en modo Debug para tener Python.h incluido antes de muchos otros archivos de inclusión estándar. solución es incluir cmath primero, seguido por Python.h, por lo que se obtiene un código como:

#include <cmath> 
#include <Python.h> 
#include < other standard headers > 
12

La respuesta por @Praetorian identifica correctamente el problema. Por otro lado, los encabezados de Python están técnicamente destinados a venir antes que cualquier otro. Además, cuando se utiliza código C++ generado y no se usa bjam (cuando se usa Cython, por ejemplo), la solución aceptada no funciona, así que se me ocurrió una solución alternativa. Añadir el siguiente indicador a la llamada a g ++:

-D_hypot=hypot 

Esto hace que sea tan perjudicial que la macro en las cabeceras de Python se convierte en un no-op, y el error de compilación desaparece.

+0

Funcionó para mí cuando construí OpenCV mientras que "-include cmath" no. – Ardavel

1

El problema es identificado correctamente por @Praetorian.

En mi caso sólo aparece en uno file.So Simplemente añadir

#define _hypot hypot antes #include <Python.h>

y obras.

Espero que esto pueda ser esclarecedor.

Cuestiones relacionadas