cmath函数生成编译器错误

时间:2009-08-01 15:56:26

标签: c++ compiler-construction cmath

我编写了一个使用Fast Light Toolkit的小程序,出于某种原因,在尝试访问cmath头中的函数时会产生编译器错误。

如错误:: acos尚未声明。

这几乎是它尝试在标题中使用的每个函数。我能错过什么?

我包含的头文件是

Simple_window.h
Graph.h

这两者都是FLTK的一部分。

代码是这样的:

    #include "Simple_window.h"  // get access to our windows library
    #include "Graph.h"          // get access to graphics library facilities

    int main()
    {
        using namespace Graph_lib; // our graphics facilities are in Graph_lib

        Point tl(100,100);         // to become top left corner of window

        Simple_window win(tl,600,400,"Canvas"); // make a simple window

        Polygon poly; // make a shape (a polygon)

        poly.add(Point(300,200));     // add a point
        poly.add(Point(350,100));     // add another point
        poly.add(Point(400,200));     // add a third point

        poly.set_color(Color::red);   // adjust properties of poly

        win.attach(poly);             // connect poly to the window

        win.wait_for_button();        // give control to display engine
    }

编辑:以下是生成编译器错误的示例代码。这是在cmath标题内。

namespace std
{
  // Forward declaration of a helper function.  This really should be
  // an `exported' forward declaration.
  template<typename _Tp> _Tp __cmath_power(_Tp, unsigned int);

  inline double
  abs(double __x)
  { return __builtin_fabs(__x); }

  inline float
  abs(float __x)
  { return __builtin_fabsf(__x); }

  inline long double
  abs(long double __x)
  { return __builtin_fabsl(__x); }

  using ::acos;  //ERROR HERE

  inline float
  acos(float __x)
  { return __builtin_acosf(__x); }

  inline long double
  acos(long double __x)
  { return __builtin_acosl(__x); }

  template<typename _Tp>
    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
    acos(_Tp __x)
    {
      return __builtin_acos(__x);
    }

编辑:Code :: blocks将文件保存为C文件....

5 个答案:

答案 0 :(得分:3)

当您包含标准C库的C ++版本(&lt; cXXXX&gt;)时,所有符号都在std命名空间中定义。在C ++中,您不需要链接数学库(不需要-lm)

#include <cmath>
#include <iostream>

int main()
{
   std::cout << std::fabs( -10.5 ) << std::endl;
}

答案 1 :(得分:1)

我遇到了这个问题 - 这让我发疯了,但我追查了原因,这与我在这个问题上看到的报道有点不同。

在这种情况下,一般的cmath标头(或math.h - 错误和解决方案发生在C ++或C中)具有架构环境开关,以包括特定于体系结构的数学子标头。架构交换机(环境变量)尚未定义,因此它正在发挥作用,实际上并不包括真正定义数学函数的头文件。

所以确实有一个math.h或cmath.h,它包含在内,但这还不足以获得数学函数。在我的例子中,我没有定义架构变量,而是找到了正确的子数学头的位置,并将它们添加到我的编译路径中。然后项目工作了!

这似乎是将Linux项目移植到OS-X时出现的问题。我想,任何时候项目都可以在平台之间移动,以便标准库标题的排列方式不同。

  • 杰夫

答案 2 :(得分:0)

由于您上面显示的代码没有直接调用acos(),因此您可以使用其中一个标头中的错误。看来在其中一个头中有一些(内联)代码调用acos()函数,而不确保函数被正确声明。这可能是宏或内联函数。

最好的解决方法是确保标题是自包含的 - 更改标题。

如果无法做到这一点,那么解决方法是在源代码中包含适当的标题(#include <cmath>)。


  

程序能够访问cmath标头,错误在cmath标头本身。

在这种情况下,您可能需要提供调用acos()的全局std::acos()函数(至少声明,也可能是定义):

double acos(double x) { return std::acos(x); }

确保它不在任何命名空间内 - 甚至不是匿名命名空间。 (检查在MacOS X上用G ++ 4.0.1编译,前面有'#include <cmath>'。鉴于你有一个有问题的<cmath>标题,你可能需要得到它的幻想:

extern double std::acos(double);
double acos(double x) { return std::acos(x); }
#include <cmath>

这非常讨厌 - 你确定你的编译器没有错误修复版本吗?


您是否有机会在命名空间中获得“#include <cmath>”?

答案 3 :(得分:0)

错误最有可能出现在您的代码中而不是cmath中...除非您在cmath中更改了某些内容。你能复制错误并告诉我们你用来编程的应用程序是什么?

答案 4 :(得分:0)

在Visual C ++中,在不使用cmath的程序中也会发生这种情况。

我发现问题在于我使用main.c文件而不是main.cpp文件。