2015-04-04 16 views
9

Ho appena aggiornato MinGW utilizzando mingw-get-setup e non sono in grado di creare alcun elemento che contenga l'intestazione <cmath> se utilizzo qualcosa di più grande di -O0 con -std=c++1y. (Ho provato anche c++11 e c++98) sto ottenendo gli errori come questo:-O1/2/3 con -std = C++ 1y/11/98 - Se <cmath> è incluso sto ricevendo errore: '_hypot' non è stato dichiarato in questo ambito

g++.exe -pedantic-errors -pedantic -Wextra -Wall -std=c++1y -O3 -c Z:\Projects\C++\L6\src\events.cpp -o obj\src\events.o 
In file included from z:\lander\mingw\lib\gcc\mingw32\4.8.1\include\c++\cmath:44:0, 
       from Z:\Projects\C++\L6\src\utils.h:4, 
       from Z:\Projects\C++\L6\src\events.cpp:10: 
z:\lander\mingw\include\math.h: In function 'float hypotf(float, float)': 
z:\lander\mingw\include\math.h:635:30: error: '_hypot' was not declared in this scope 
{ return (float)(_hypot (x, y)); } 

sia qualcosa di sbagliato con me?
Oppure la versione di repo mingw è bug? E se sì, c'è una soluzione rapida per questa intestazione?

+0

Hai provato ad aggiungere '-lm' alla fine della riga di comando' g ++ '? –

+0

@KeithThompson Stesso errore. Sei in grado di riprodurlo? – HolyBlackCat

+0

Il problema si verifica con * qualsiasi * programma che ha '#include ', o solo con programmi che chiamano 'hypot()'? –

risposta

15

Per evitare ulteriori speculazioni e suggerimenti errati come l'utilizzo di #if 0, consentitemi di fornire una risposta autorevole, dal punto di vista di un collaboratore del progetto MinGW.

Sì, l'implementazione MinGW.org di include/math.h ha un bug nella sua implementazione in linea di hypotf (float, float); il bug viene attivato durante la compilazione di C++, inclusa l'intestazione interessata (come è quando cmath è incluso), e viene specificata qualsiasi opzione del compilatore che determini lo __STRICT_ANSI__ definito (come nel caso delle opzioni -std=c... annotate dal OPERAZIONE). La soluzione appropriata è non per occludere parte del file math.h, con #if 0 o altro, ma per correggere l'implementazione in linea interrotta di hypotf (float, float); rimuovendo semplicemente il carattere di sottolineatura iniziale spurio dal riferimento in linea a _hypot (float, float), dove il valore restituito viene convertito nel tipo di ritorno float dovrebbe essere sufficiente.

In alternativa, la sostituzione di un valore equivalente -std=gnu... per -std=c... nelle opzioni del compilatore dovrebbe aggirare il bug e offrire una soluzione alternativa adeguata.

FWIW, non sono completamente soddisfatto dell'attuale implementazione di MinGW.org di hypotl (long double, long double); correggere entrambi i problemi è nella mia lista di punch per la prossima versione del runtime MinGW, ma ATM, ho poco tempo da dedicare a preparare questo.

Aggiornamento

Questo bug non è più presente nella versione corrente della libreria di runtime MinGW.org (attualmente mingwrt-3.22.4, ma sono fissati dalla release 3.22). Se si utilizza qualcosa di più vecchio di questo, (incluso qualsiasi dello rotto in modo critico 4.x versioni), è necessario eseguire l'aggiornamento.

+0

In alternativa, sostituendo un equivalente -std = gnu ... per -std = c ... quindi stai dicendo sostituto -std = gnu ++ 0x per -std = C++ 0x? – ScottF

+0

@ScottF: "_ stai dicendo sostituto -std = gnu ++ 0x per -std = C++ 0x? _". Sì, esattamente quello. L'effetto è di abilitare la semantica della corrispondente opzione '-std = c ...', (dove ciò può essere importante), ma _ senza soppressione delle estensioni GNU, e, in particolare, di evitare la specifica di '__STRICT_ANSI__'. –

1

MinGW utilizza gcc e la libreria runtime Microsoft. Supporto all'implementazione di Microsoft C90, ma il suo supporto per le versioni successive dello standard C (C99 e C11) è molto scarso.

La funzione hypot (insieme a hypotf e hypotl) è stata aggiunta in C99.

Se stai ricevendo questo errore con un programma che chiama hypot, come ad esempio:

#include <cmath> 
int main() { 
    std::cout << std::hypot(3.0, 4.0)) << '\n'; 
} 

Poi è solo una limitazione della libreria di runtime di Microsoft, e quindi di MinGW. Se si verifica con qualsiasi programma con #include <cmath>, è un errore, forse un errore di configurazione, in MinGW.

+1

Il programma di test sopra dovrebbe probabilmente includere "" se vuole chiamare "hypot" non qualificato. –

+0

@JonathanWakely: l'ho cambiato in 'std :: hypot'. –

2

Come notato da Keith, questo è un bug nell'intestazione MinGW.org.

In alternativa alla modifica dell'intestazione MinGW.org, è possibile utilizzare MinGW-w64, che fornisce tutto ciò che MinGW.org offre e molto altro ancora. Per un elenco delle differenze tra i tempi di funzionamento, vedere this wiki page.

Problemi correlati