14

我正在尝试使用 GCC 4.7.0 (MinGW) 构建 Boost 1.49.0。我不断收到以下错误消息数十次:

c:\tools\mingw\bin../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/c++/4.7.0/cmath:1096:11 : 错误: '::hypot' 尚未声明

第 1096 行cmath包含

using ::hypot;

cmath包括math.hhypot函数声明为

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

在这两个文件中,上面引用的几行之后的几行是hypotl函数的相同语句(除了类型是long double而不是double),并且看起来很高兴。

任何想法为什么我会收到此错误?

4

7 回答 7

17

@Praetorian 的回答正确地识别了问题。另一方面,Python 标头在技术上意味着排在任何其他标头之前。此外,有时接受的解决方案在构建系统中不起作用或不方便,因此我想出了一个替代解决方案。将以下标志添加到对 g++ 的调用中:

-D_hypot=hypot

这使得 Python 头文件中的有害宏成为空操作,并且编译错误消失了。

于 2015-06-17T02:08:52.967 回答
14

Found the answer in this forum post. It seems that pyconfig.h has the following lines:

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

but cmath included with MinGW expects the function to be named hypot and not _hypot, which causes the compilation errors.

The fix was to include the following to my bjam command line's cxxflags option

bjam ... cxxflags="-include cmath "

This indicates that g++ should include the cmath header at the beginning of every source file.

于 2012-08-25T18:44:52.707 回答
3

据我所知,在使用 MingW 编译、使用 -std=c++0xx 并在 cmath 之前包含 Python.h 时会发生这种情况。并注意 cmath 包含在相当多的其他头文件中......请注意,问题不是特定于 Boost 的。复杂的事实是,在我的标准 MingW - Visual Studio 交叉编译设置中,Visual Studio 2010 需要在调试模式下在许多其他标准包含文件之前包含 Python.h。解决方案是首先包含 cmath,然后是 Python.h,因此您会得到如下代码:

#include <cmath>
#include <Python.h>
#include < other standard headers >
于 2014-11-22T21:34:47.120 回答
3

@Praetorian 正确识别了该问题。

在我的情况下,它只出现在一个文件中。所以我只是添加

#define _hypot hypot#include <Python.h>

和作品。

希望这能有所启发。

于 2017-04-20T07:12:08.267 回答
0

尝试查看预处理单元。我猜你会发现类似“#undef hypot”的东西。

于 2012-05-19T05:59:02.217 回答
0

当我在链接器中添加以下路径时,我可以在代码块中解决此错误

C:\Python36-32\libs 

并将两个库放在链接库上:libpython36.apython36.lib

于 2018-08-15T19:41:38.213 回答
-1

添加这一行

#define _hypot hypot

在您的Python.h文件的第一个,它存储在您的 python 安装目录中。某处像C:\Python27\include

于 2019-03-27T18:48:29.483 回答