cmath-функции, генерирующие ошибку компилятора - PullRequest
1 голос
/ 01 августа 2009

Я написал небольшую программу, которая использует набор инструментов Fast Light, и по какой-то причине при попытке доступа к функциям в заголовке 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 ]

3 голосов
/ 01 августа 2009

Когда вы включаете версию C ++ () стандартных библиотек C, все символы определяются в пространстве имен std. В C ++ вам не нужно ссылаться на математическую библиотеку (-lm не требуется)

#include <cmath>
#include <iostream>

int main()
{
   std::cout << std::fabs( -10.5 ) << std::endl;
}
1 голос
/ 23 сентября 2013

У меня была эта проблема - она ​​сводила меня с ума, но я нашел причину, и она немного отличалась от того, что я видел по этой проблеме.

В этом случае общий заголовок cmath (или math.h - ошибка и решение возникают в C ++ или C) имели переключатели архитектурной среды для включения специфических для архитектуры подзаголовков математики. Переключатель архитектуры (переменная окружения) не был определен, поэтому он включал заголовок, который фактически не включал заголовки, которые действительно определяли математические функции.

Таким образом, действительно был один файл math.h или cmath.h, и он был включен, но этого было недостаточно, чтобы получить математические функции. В моем случае, вместо того, чтобы определять архитектурную переменную, я вместо этого нашел расположение правильных подматематических заголовков и добавил их в мой путь компиляции. Тогда проект заработал!

Это, похоже, проблема, которая часто возникает при портировании проектов Linux на OS-X. Я мог бы предположить, что это может произойти в любое время, когда проект был перемещен между платформами таким образом, что заголовки стандартной библиотеки расположены по-разному.

  • Джеф
0 голосов
/ 02 июля 2012

Это также происходит в Visual C ++, в программах, не использующих sapuse cmath.

Я обнаружил, что проблема в том, что я использовал main.c файл вместо main.cpp файл.

0 голосов
/ 02 августа 2009

Ошибка, скорее всего, в вашем коде, а не в cmath ... если вы не изменили что-то в cmath. Не могли бы вы скопировать ошибки и сообщить нам, какое приложение вы используете для программирования?

0 голосов
/ 01 августа 2009

Поскольку ваш код, как показано выше, напрямую не вызывает acos(), возможно, есть ошибка в одном из заголовков, которые вы используете. Похоже, что в одном из заголовков есть некоторый (встроенный) код, который вызывает функцию acos(), не гарантируя, что функция должным образом объявлена. Это может быть макрос или встроенная функция.

Лучшее решение - обеспечить автономность заголовков - изменить заголовки.

Если это невозможно, то взломать должен включить соответствующий заголовок (#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>' внутри пространства имен?

...