我正在尝试使用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
),而且似乎快乐。
为什么我收到此错误的任何想法?
答案 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
这样的地方。