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++ の sapuse を使用しないプログラムでも発生しますcmath

main.cファイルの代わりにファイルを使用したことが問題であることがわかりましたmain.cpp

于 2012-07-02T18:49:46.400 に答える
0

上記のコードは を直接呼び出していないため、acos()使用しているヘッダーの 1 つに間違いなくバグがあります。acos()関数が適切に宣言されていることを確認せずに関数を呼び出すヘッダーの 1 つに (インライン) コードがあるようです。これは、マクロまたはインライン関数である可能性があります。

最善の解決策は、ヘッダーが自己完結型であることを確認することです - ヘッダーを変更してください。

それが不可能な場合のハックアラウンドは#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>名前空間内に ' ' がある可能性はありますか?

于 2009-08-01T16:20:32.737 に答える
-1

エラーは、cmathで何かを変更しない限り、cmathではなくコードにある可能性が最も高いです。エラーをコピーして、プログラミングに使用しているアプリケーションを教えてください。

于 2009-08-01T20:46:33.777 に答える