我刚刚使用mingw-get-setup
更新了MinGW,如果我使用大于<cmath>
-O0
的任何内容,我就无法构建任何包含-std=c++1y
标头的内容。 (我也试过c++11
和c++98
)我收到的错误就像这样:
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)); }
我身上有什么问题吗? 或mingw repo的版本被窃听?如果是这样,这个标题有没有快速解决方法?
答案 0 :(得分:15)
为了避免任何进一步的推测,以及使用#if 0
这些非常糟糕的建议,让我从MinGW项目撰稿人的角度给出一个权威的答案。
是的,include/math.h
的MinGW.org实施在hypotf (float, float)
的内联实施中确实存在错误;编译C ++时会触发错误,包含受影响的标头(包括cmath
时),和指定导致__STRICT_ANSI__
定义的任何编译器选项,(与OP注意到的那些-std=c...
选项的情况一样)。相应的解决方案不以math.h
或其他方式遮挡#if 0
文件的一部分,但要更正hypotf (float, float)
的损坏的内联实现;简单地从内联引用_hypot (float, float)
中删除虚假的前导下划线,其返回值转换为float返回类型就足够了。
或者,在编译器选项中用等效-std=gnu...
代替-std=c...
可以规避错误,并可能提供合适的解决方法。
FWIW,我对MinGW.org当前实施的hypotl (long double, long double)
并不满意;纠正这两个问题是我下一个MinGW运行时版本的打卡列表,但ATM,我几乎没有时间专心准备这个。
<强>更新强>
当前版本的MinGW.org运行时库(目前是mingwrt-3.22.4,但自3.22版以来已修复)中不再出现此错误。如果您使用的是旧版本(任何 严重损坏 4.x版本),则应升级。
答案 1 :(得分:2)
正如Keith所说,这是MinGW.org标题中的一个错误。
作为编辑MinGW.org标题的替代方法,您可以使用MinGW-w64,它提供MinGW.org提供的所有内容,以及更多内容。 有关运行时之间差异的列表,请参阅this wiki page。
答案 2 :(得分:1)
MinGW使用gcc和Microsoft运行时库。 Microsoft的实现支持C90,但它对更高版本的C标准(C99和C11)的支持非常差。
在C99中添加了hypot
功能(以及hypotf
和hypotl
)。
如果您使用调用hypot
的程序收到此错误,例如:
#include <cmath>
int main() {
std::cout << std::hypot(3.0, 4.0)) << '\n';
}
然后它只是Microsoft运行时库的限制,因此也是MinGW的限制。如果它出现在任何带有#include <cmath>
的程序中,那么它是MinGW中的一个错误,可能是配置错误。