CMATH功能生成编译器错误(cmath functions generating compiler

2019-10-17 05:04发布

我写了一个小程序,利用耐晒工具包出于某种原因,试图访问在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);
    }

编辑:代码::块的文件保存为C文件....

Answer 1:

如果包括的标准C库中的C ++版本(<CXXXX>)中的所有符号被std命名空间中定义的。 在C ++中,你不需要对数学库链接(不需要-lm)

#include <cmath>
#include <iostream>

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


Answer 2:

我有这个问题 - 这是推动我疯了,但我找到了原因,这是比我见过的报道在这个问题上有一点不同。

在这种情况下,一般CMATH报头(或文件math.h - 误差和溶液发生在C ++或C)具有建筑环境切换到包括特定结构的数学子报头。 该架构交换机(环境变量)还没有明确规定,所以这是撑船,而不是实际上包括真正定义的数学函数头。

因此,确实有一个单一的文件math.h或cmath.h,它被包括在内,但是这还不足以让数学函数。 在我的情况,而不是定义建筑的变量,而不是我发现正确的子数学头的位置,并将它们添加到我的编译路径。 那么该项目的工作!

这似乎是把Linux移植项目,OS-X的时候,来了很多的问题。 我想像它可能随时出现的一个项目被移动betwee平台,使得标准库头排列不同。

  • 杰夫


Answer 3:

由于如上所示不直接调用你的代码acos()有可以说是在你使用的标题之一的错误。 这似乎在说明中调用该头的一个部分(在线)代码acos()函数不保证功能正确声明。 这可能是一个宏或内联函数。

最好的解决办法是,以确保头是独立的 - 改变头。

如果这是不可能的,hackaround是包括适当的头( #include <cmath>可能)在源代码中。


该方案是能够访问CMATH头,误差在CMATH头本身。

在这种情况下,你可能需要提供一个全球性的acos()函数(声明至少,可能定义太)调用到std::acos()

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

只要确保这不是任何命名空间内 - 甚至是匿名的。 (请与G ++ 4.0.1在MacOS X编译,以“ #include <cmath> ”它前面假设你有一个有问题的。 <cmath>标题,你可能需要一些花样:

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

这是非常讨厌的 - 你肯定没有你的编译器的错误修正版本?


是否有任何机会,你有“ #include <cmath> ”在命名空间里?



Answer 4:

该错误是最有可能在你的代码,而不是在CMATH ......除非你在CMATH改变一些东西。 您可以复制错误,并告诉我们什么是您使用的编程应用?



Answer 5:

这也恰好在Visual C ++,在不sapuse使用程序cmath

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



文章来源: cmath functions generating compiler error