2012-05-18 5 views
11

Sto provando a creare Boost 1.49.0 utilizzando GCC 4.7.0 (MinGW). Continuo a ricevere il seguente messaggio di errore di diverse decine di volte:Errore nella creazione di 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

Linea 1096 di cmath contiene

using ::hypot; 

cmath include math.h che dichiara la funzione hypot come

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

In entrambi i file, un paio di righe dopo quelle citate sopra, sono dichiarazioni identiche per lo hypotl (eccetto il tipo è long double anziché double) e quello sembra felice.

Qualche idea del motivo per cui viene visualizzato questo errore?

risposta

12

Trovato la risposta in this forum post. Sembra che pyconfig.h ha le seguenti linee:

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

ma cmath incluso con MinGW si aspetta che la funzione di essere nominato hypot e non _hypot, che fa sì che gli errori di compilazione.

La correzione è stato quello di comprendere quanto segue per CXXFLAGS è la mia linea di comando bjam opzione

bjam ... cxxflags="-include cmath " 

Ciò indica che g ++ dovrebbe includere il cmath intestazione all'inizio di ogni file sorgente.

+0

Grazie, che ha fatto il trucco! – Mercyful

0

Provare a guardare l'unità preelaborata. Immagino che troverai qualcosa come "# hypef hypot".

3

Per quanto posso vedere ciò accade durante la compilazione con MingW, utilizzando -std = C++ 0xx e includendo Python.h prima di cmath. E nota che cmath è incluso da parecchi altri file di intestazione ... Nota che il problema non è Boost specifico. Il fatto complicato è che nella mia configurazione di compilazione incrociata standard di MingW - Visual Studio, in Visual Studio 2010 è necessario in modalità Debug per includere Python.h prima di molti altri file standard inclusi. soluzione è quella di includere cmath primo, seguito da Python.h, in modo da ottenere un codice simile:

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

La risposta da @Praetorian identifica correttamente il problema. D'altra parte, le intestazioni Python sono tecnicamente pensate per venire prima di qualsiasi altra. Inoltre, quando si utilizza codice C++ generato e non si utilizza bjam (quando si utilizza Cython, ad esempio), la soluzione accettata non funziona, quindi ho trovato una soluzione alternativa. Aggiungere il seguente bandiera per la chiamata a g ++:

-D_hypot=hypot 

Questo fa in modo che la macro nocivo nelle intestazioni Python diventa un no-op, e l'errore di compilazione va via.

+0

Ha funzionato per me quando ho creato OpenCV mentre "-include cmath" non lo ha fatto. – Ardavel

1

Il problema viene identificato correttamente da @Praetorian.

Nel mio caso appare solo in una file.So ho semplicemente aggiungo

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

e lavora.

Spero che questo può essere illuminante.