2015-04-04 8 views
9

Ich habe gerade MinGW mit mingw-get-setup und aktualisiert Ich bin nicht in der Lage, Anyting zu erstellen, die <cmath> Header enthält, wenn ich etwas größer als -O0 mit -std=c++1y verwenden. (Ich habe auch versucht c++11 und c++98) Ich erhalte Fehler wie diese:-O1/2/3 mit -std = C++ 1y/11/98 - Wenn <cmath> enthalten ist bekomme ich Fehler: '_hypot' wurde nicht in diesem Bereich deklariert

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)); } 

Stimmt etwas nicht auf meiner Seite?
Oder Version bei Mingw Repo ist abgehört? Und wenn ja, gibt es eine schnelle Lösung für diesen Header?

+0

Haben Sie versucht, '-lm' am Ende der' g ++ 'Kommandozeile hinzuzufügen? –

+0

@KeithThompson Gleicher Fehler. Kannst du es reproduzieren? – HolyBlackCat

+0

Tritt das Problem bei * any * -Programmen auf, die '#include ' enthalten, oder nur bei Programmen, die 'hypot()' aufrufen? –

Antwort

15

Um weitere Spekulationen und geradezu schlechte Vorschläge wie die Verwendung #if 0 zu vermeiden, lassen Sie mich eine autoritative Antwort geben, aus der Perspektive eines MinGW-Projektmitwirkenden.

Ja, die MinGW.org-Implementierung von include/math.h hat einen Fehler in der Inline-Implementierung von hypotf (float, float); Der Fehler wird beim Kompilieren von C++ ausgelöst, wenn der betroffene Header enthalten ist (wie es ist, wenn cmath enthalten ist), und eine Compileroption, die __STRICT_ANSI__ definiert wird, wird festgelegt, (wie für die -std=c... Optionen von der OP). Die geeignete Lösung ist nicht, Teil der math.h Datei mit #if 0 oder anders zu verschließen, aber die gebrochene Inline-Implementierung von hypotf (float, float) zu korrigieren; Das Entfernen des unwahren führenden Unterstrichs aus der Inline-Referenz auf _hypot (float, float), bei der der Rückgabewert in den Float-Rückgabetyp umgewandelt wird, sollte ausreichen.

Alternativ sollte in den Compiler-Optionen ein -std=gnu... für -std=c... in den Compiler-Optionen ersetzt werden und eine geeignete Problemumgehung bieten.

FWIW, ich bin nicht ganz glücklich mit der aktuellen Implementierung von hypotl (long double, long double) von MinGW.org; Beide Probleme zu beheben ist auf meiner Punch-Liste für die nächste Version der MinGW Runtime, aber ATM, ich habe wenig Zeit, um dies vorzubereiten.

aktualisiert

Dieser Fehler ist nicht mehr vorhanden in der aktuellen Version der MinGW.org Laufzeitbibliothek (derzeit mingwrt-3.22.4, aber 3,22 seit Release behoben). Wenn Sie etwas älteres als dieses verwenden (einschließlich beliebig des kritisch gebrochen 4.x Releases) sollten Sie upgraden.

+0

Oder ersetzen Sie ein Äquivalent -std = gnu ... für -std = c ... also sagen Sie stellvertretend -std = gnu ++ 0x für -std = C++ 0x? – ScottF

+0

@ScottF: "_Sie sagen stellvertretend -std = gnu ++ 0x für -std = C++ 0x? _". Ja, genau das. Der Effekt besteht darin, die Semantik der entsprechenden Option "-std = c ..." (wo das wichtig sein kann) zu aktivieren, aber ohne Unterdrückung von GNU-Erweiterungen, und insbesondere die Angabe von "__STRICT_ANSI__" zu vermeiden. –

1

MinGW verwendet gcc und die Microsoft-Laufzeitbibliothek. Microsofts Implementierung unterstützt C90, aber die Unterstützung für spätere Versionen des C-Standards (C99 und C11) ist sehr schlecht.

Die Funktion hypot (zusammen mit hypotf und hypotl) wurde in C99 hinzugefügt.

Wenn Sie diesen Fehler mit einem Programm, wenn es darum geht, die hypot, wie nennt:

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

dann ist es nur eine Einschränkung der Microsoft-Laufzeitbibliothek und damit von MinGW. Wenn es mit irgendein Programm auftritt, das #include <cmath> hat, dann ist es ein Fehler, vielleicht ein Konfigurationsfehler, in MinGW.

+1

Das oben genannte Testprogramm sollte wahrscheinlich '' enthalten, wenn es "unqualifiziert" heißen soll. –

+0

@ JonathanWakely: Ich habe es in 'std :: hypot' geändert. –

2

Wie von Keith bemerkt, ist dies ein Fehler im MinGW.org-Header.

Als Alternative zum Bearbeiten des MinGW.org-Headers können Sie MinGW-w64 verwenden, das alles bietet, was MinGW.org bietet, und noch viel mehr. Eine Liste der Unterschiede zwischen den Laufzeiten finden Sie unter this wiki page.