2009-08-01 9 views
1

Ich habe ein kleines Programm geschrieben, das das Fast Light Toolkit verwendet und aus irgendeinem Grund wird ein Compilerfehler beim Versuch, auf die Funktionen im cmath-Header zuzugreifen, erzeugt.cmath-Funktionen erzeugen Compilerfehler

Wie Fehler: acos wurde nicht deklariert.

Dies geht für so ziemlich jede Funktion, die es versucht, in der Kopfzeile zu verwenden. Was könnte ich vermissen?

Die Header-Dateien I enthalten sind, sind

Simple_window.h 
Graph.h 

beide Teil des FLTK sind.

Der Code ist dies:

#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 
    } 

Edit: Hier ist Beispielcode aus, wenn der Compiler-Fehler erzeugt wird. Dies ist innerhalb des cmath-Headers.

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); 
    } 

Edit: Code :: Blocks ist Dateien als C Speichern von Dateien ....

+0

Auf einer Seite zur Kenntnis, versuchen Sie auf dem "Warum", nicht "was" zu konzentrieren, in den Kommentaren. poly.add (Punkt (300,200)); // füge einen Punkt hinzu Wir wissen, dass es einen Punkt hinzufügt. Sagen Sie "warum" Sie diesen Punkt hinzufügen. Es ist auch keine gute Idee, die Kommentare auszurichten. –

+0

Das war direkt aus dem Buch, das ich benutze. Es hilft mir mehr zu verstehen, was die verschiedenen Funktionen bewirken. – trikker

+0

Welchen Compiler/Version benutzen Sie? Ist das der erste Fehler, den Sie bekommen? (Meine wilde Vermutung ist jetzt, dass der Compiler nicht korrekt installiert ist, da der Fehler in der Bibliothek liegt: findet der Compiler die Bibliothek?) –

Antwort

0

Da Ihr Code wie oben gezeigt direkt acos() nicht nennen, gibt es wohl einen Fehler in einem der Header, die Du benutzt es. Es scheint, dass es einen (Inline-) Code in einem der Header gibt, der die acos()-Funktion aufruft, ohne sicherzustellen, dass die Funktion richtig deklariert ist. Dies könnte eine Makro- oder eine Inline-Funktion sein.

Die beste Lösung ist sicherzustellen, dass die Header eigenständig sind - ändern Sie die Header.

Wenn das nicht möglich ist, besteht die Problembehandlung darin, den entsprechenden Header (#include <cmath>, wahrscheinlich) in den Quellcode aufzunehmen.


Das Programm in der Lage ist, den cmath Header zugreifen zu können, ist der Fehler in dem cmath Header selbst.

In diesem Fall werden Sie wahrscheinlich (möglicherweise Definition zu Erklärung zumindest) zur Verfügung stellen müssen eine globale acos()-Funktion, die auf std::acos() ruft:

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

Sie sicher, machen dies nicht in jedem Namespace - nicht einmal der anonyme. . (Check mit G ++ kompiliert 4.0.1 auf MacOS X, mit ‚#include <cmath>‘ es vorhergehenden Vorausgesetzt, dass Sie haben eine problematische <cmath> Header, müssen Sie möglicherweise Lust bekommen:

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

Das ist ziemlich böse - sind Sie sicher, es ist kein Bug-feste Version des Compilers?


gibt es eine Chance, die du hast ‚#include <cmath>‘ in einem Namespace?

+0

Das Programm ist in der Lage, auf die cmath-Header zuzugreifen, ist der Fehler in der cmath-Header selbst. – trikker

+0

Es gibt auch '', die verwendet werden könnte, um globale 'acos()' zu deklarieren - vielleicht ... –

3

Wenn Sie die Include C++ - Version (< cXXXX>) von C-Standardbibliotheken Alle Symbole sind im Namespace std definiert.In C++ müssen Sie in cmath nicht verknüpfen gegen die Mathematik-Bibliothek (-Im ist nicht erforderlich)

#include <cmath> 
#include <iostream> 

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

Der Fehler ist höchstwahrscheinlich in Ihrem Code sein und nicht ..., wenn Sie etwas in cmath geändert. Könnten Sie die Fehler kopieren und uns mitteilen, welche Anwendung Sie zum Programmieren verwenden?

+0

Code :: Blocks. Es gibt einen Fehler für so ziemlich jede Funktion in cmath, so dass ich sie nicht alle veröffentlichen kann. Die Fehler sagen alle, dass sie nicht deklariert wurden. – trikker

+0

* Die Funktionen wurden nicht deklariert. – trikker

+0

Wo benutzt du sie? – Partial

0

Es passiert auch in Visual C++, in Programmen, die nicht sapuse cmath verwenden.

Ich habe festgestellt, dass das Problem ist, dass ich main.c Datei anstelle von main.cpp Datei verwendet habe.

1

Ich hatte dieses Problem - es machte mich verrückt, aber ich fand die Ursache, und es war ein wenig anders als das, was ich in diesem Thema gemeldet gesehen habe.

In diesem Fall enthielt der allgemeine cmath-Header (oder math.h - der Fehler und die Lösung in C++ oder C) Architekturumgebungsschalter, um architekturspezifische mathematische Unterheader einzubeziehen. Der Architekturschalter (Umgebungsvariable) wurde nicht definiert, also wurde er gekippt und enthielt nicht die Header, die die mathematischen Funktionen wirklich definierten.

So gab es tatsächlich eine einzige math.h oder cmath.h, und es wurde enthalten, aber das war nicht genug, um die mathematischen Funktionen zu bekommen. In meinem Fall habe ich statt der Definition der Architekturvariable stattdessen die Position der korrekten Sub-Mathe-Header gefunden und sie zu meinem Kompilierpfad hinzugefügt. Dann hat das Projekt funktioniert!

Dies scheint ein Problem zu sein, das bei der Portierung von Linux-Projekten auf OS-X auftaucht. Ich könnte mir vorstellen, dass es immer dann vorkommen könnte, wenn ein Projekt zwischen Plattformen verschoben wird, so dass die Header der Standardbibliothek anders angeordnet sind.

  • Jeff
Verwandte Themen