1

我编写了一个使用 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 文件....

4

5 回答 5

3

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

#include <cmath>
#include <iostream>

int main()
{
   std::cout << std::fabs( -10.5 ) << std::endl;
}
于 2009-08-01T17:00:05.933 回答
1

我遇到了这个问题 - 它让我发疯,但我找到了原因,这与我看到的关于这个问题的报道有点不同。

在这种情况下,通用 cmath 标头(或 math.h - C++ 或 C 中出现的错误和解决方案)具有架构环境切换以包含架构特定的数学子标头。体系结构开关(环境变量)尚未定义,因此它是下注,实际上并未包含真正定义数学函数的标头。

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

在将 Linux 项目移植到 OS-X 时,这似乎是一个经常出现的问题。我想它可能会在项目在平台之间移动的任何时候发生,这样标准库头文件的排列方式就会不同。

  • 杰夫
于 2013-09-23T19:52:56.863 回答
0

它也发生在 Visual C++ 中,在不打算使用cmath.

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

于 2012-07-02T18:49:46.400 回答
0

由于您如上所示的代码没有直接调用acos(),因此可以说您使用的其中一个标头中存在错误。似乎其中一个标头中有一些(内联)代码调用了该acos()函数,而没有确保正确声明了该函数。这可能是宏或内联函数。

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

如果这不可能,解决方法是#include <cmath>在源代码中包含适当的标头(可能)。


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

在这种情况下,您可能需要提供一个调用 on 的全局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>在命名空间中有''?

于 2009-08-01T16:20:32.737 回答
-1

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

于 2009-08-01T20:46:33.777 回答