使用GCC 4.7.0构建Boost 1.49.0时出错

时间:2012-05-18 22:32:09

标签: c++ boost mingw

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

  

C:\工具\ mingw的\ BIN ../ LIB / GCC / i686的-PC-的mingw32 / 4.7.0 /../../../../包括/ C ++ / 4.7.0 / CMATH: 1096:11:错误:':: hypot'尚未声明

cmath的第1096行包含

using ::hypot;

cmath包含math.h,它将hypot函数声明为

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

在这两个文件中,上面引用的几行之后是hypotl函数的相同语句(类型为long double而不是double),而且似乎快乐。

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

7 个答案:

答案 0 :(得分:16)

@Praetorian的答案正确地识别了问题。 另一方面,Python头文件在技术上意味着要先于其他任何版本。 此外,有时接受的解决方案在构建系统中不起作用或不方便,因此我提出了另一种解决方案。 将以下标志添加到对g ++的调用中:

-D_hypot=hypot

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

答案 1 :(得分:13)

this forum post中找到答案。似乎 pyconfig.h 有以下几行:

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

但MinGW附带的 cmath 期望该函数名为hypot而不是_hypot,这会导致编译错误。

修复是将以下内容包含在我的bjam命令行的 cxxflags 选项中

bjam ... cxxflags="-include cmath "

这表明g ++应该在每个源文件的开头包含 cmath 标头。

答案 2 :(得分:3)

据我所知,使用-Wd编译时,使用-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 >

答案 3 :(得分:2)

问题由@Praetorian正确识别。

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

#define _hypot hypot

之前

#include <Python.h>

并且有效。

希望这可以启发。

答案 4 :(得分:0)

尝试查看预处理单元。我想你会找到类似“#undef hypot”的东西。

答案 5 :(得分:0)

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

C:\Python36-32\libs 

,并将两个库放在链接库中: libpython36.a python36.lib

答案 6 :(得分:-1)

添加此行

while

在您的#define _hypot hypot 文件的第一个文件中,该文件存储在python安装目录中。像Python.h这样的地方。