Forum: Compiler & IDEs Probleme mit atan2() unter CoIDE mit GCC


von Chris B. (cbb)


Lesenswert?

Hi zusammen,

habe ein Problem, wenn ich die Funktion atan2() oder atan2f() einfüge.

Es kommen diese Fehlermeldungen:

.../main.c:442: undefined reference to `atan2f'
[cc] collect2.exe: error: ld returned 1 exit status

Inkludiert habe ich folgendes:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

Ich habe schon ein bisschen recherchiert mit Compilerfehler/Linkerfehler 
und libm.a sowie einem Konsolenaufruf mit -lm.
Ich werde jedoch nicht schlau, wie ich das realisieren soll.
Könnt ihr mir auf die Sprünge helfen? Was muss ich unter CoIDE mit GCC 
machen, damit ich atan verwenden kann? Betriebssystem ist XP.

Schonmal vielen Dank.

Viele Grüße

: Bearbeitet durch User
von M.K. B. (mkbit)


Lesenswert?

Falls es dir nicht klar sein sollte, erklär ich mal kurz, was der Fehler 
bedeutet.

In der main.c verwendest du die atan2f Funktion. Durch das include von 
math.h sagt man dem Compiler, dass es die Methode gibt.
Nach dem Compilieren sucht der Linker nun den Code für atan2f, findet 
diesen aber nicht.

Deine Recherche ist richtig, denn der Code für atan2f, den der Linker 
nicht findet ist in der libm. Mit -lm teilst du dem Linker mit, diese 
Bibliothek mit in das Programm zu linken.

In deiner IDE (ich kenne CoIDE leider nicht) müsste es Optionen für den 
Linker geben. Dort müsstest du dann -lm angeben.
Es könnte allerdings sein, dass der Compiler die Bibliothek bei dir 
nicht mitgeliefert hat.


Probier mal das -lm beim Compiler aus. Sollte das nicht funktionieren, 
dann kann ich das mal bei mir lokal ausprobieren.

von Chris B. (cbb)


Lesenswert?

Hi,

danke Dir für deine Antwort.
Ich habe gestern Nachmittag noch die Lösung gefunden:

In der COIDE unter dem Menuepunkt View -> Configurationn gehen.
Dort unter dem Tab "Link" gibt es ein Auswahlmenue.
In diesem gibt es z.B. diese Einträge:

"Use base C Libary", "Not use base C Libary" usw.

Das habe ich mal auf Use base C Libary gesetzt,da es auf Not use stand.
Unten im Linker Control String taucht dann automatisch das -lm auf.

Seit dem funktioniert das mit dem atan2 bzw. atan2f.

Im Menue Configurations gibt es außerdem die MÖglichkeit Linked Libarys 
und Includepath für den Compiler hinzuzufügen.

Was ich noch nicht verstehe ist, dass keine Defines von math.h in meiner 
main funktionieren. Ist das normal?

Ich habe es folgendermaßen includiert
1
#include <math.h>

und möchte dann die Definition M_PI verwenden, funktioniert aber nicht 
mit der Fehlermeldung:
1
18: error: 'M_PI' undeclared (first use in this function)

Muss ich Defines extra in richtigen zu meinem Projekt gehörenden Header 
oder C-files eintragen?

Viele Grüße Chris

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Chris B. schrieb:
> und möchte dann die Definition M_PI verwenden, funktioniert aber nicht
> mit der Fehlermeldung:
M_PI hat nichts mit C oder C++ zu tun, und ist daher nicht in deiner 
Library enthalten. Lediglich einige C Compiler einiger Betriebssysteme 
liefern eine Library mit, in der M_PI definiert ist. Ergo musst du dir 
M_PI selbst definieren.

von M.K. B. (mkbit)


Lesenswert?

Du kannst je nach IDE auch einfach in die Headerdateien reinschauen, 
sonst musst du sie halt auf der Platte per Hand suchen.

In der Headerdatei siehst du dann auch, was definiert ist.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

M_PI ist nicht im C/C++ Standard enthalten sondern eine GNU-Erweiterung, 
etwa in det GNU Libc (glibc) enthalten. Evtl. funktioniert auch #define 
GNU_SOURCE oder ähnliches vor Include von math.h.  AM besten mal in den 
Header reinschauen.

von Chris B. (cbb)


Lesenswert?

Hi,

also die math.h beinhaltet schon die M_PI definition.
Ich habe rein geschaut. Man kann in der CoIDE die entsprechenden 
Funktionen bzw. Header-Dateien mit F3 öffnen.

Das komische ist, dass die atan2 Funktion, welche in der gleichen Header 
definiert wurde, funktioniert.
Außerdem habe ich gerade nachgesehen, wenn ich die M_PI Definition/Macro 
mit F3 öffne, dann springt der an die richtige Stelle!
Beim Rebuild All oder Rebuld kommt aber dennoch diese Fehlermeldung:
1
:15: error: 'M_PI' undeclared (first use in this function)

Ich bin ratlos, woran es liegen sollte...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Vermutlich befindet sich das M_PI innerhal von #if of #ifdef, siehe oben 
betreffs GNU_SOURCE.

von Marco (Gast)


Lesenswert?

M_PI ist nicht definiert, wenn man gcc auffordert ISO oder 
ANSI-Standard-Kompliant zu sein, da in so einem Fall die GNU 
Erweiterungen abgeschaltet werden. Beispiel:
1
$ cat foo.c 
2
#include <math.h>
3
4
int main(int argc,char **argv)
5
{
6
  return (int)M_PI;
7
}
8
$ # funktioniert: 
9
$ gcc foo.c 
10
$ # das auch
11
$ gcc --stc=gnu90
12
$ # das nicht:
13
$ gcc --std=c90 foo.c 
14
foo.c: In function ‘main’:
15
foo.c:5:14: error: ‘M_PI’ undeclared (first use in this function)
16
foo.c:5:14: note: each undeclared identifier is reported only once for each function it appears in
17
$ # da passiert das auch: 
18
$ gcc -ansi foo.c

Guck mal in der IDE ob du da irgendeine Option mit "ANSI", "ISO" oder 
"Standard" findest und schau was du da ändern kannst.

von Info (Gast)


Lesenswert?

Ich hatte auch das Problem mit M_PI. Lösung: bei EM::Blocks unter 
"Project build options" in "Compiler settings" zur Kategorie "Language 
Standard" z.B. "GNU 99" auswählen.

Ich habe auch mal eine Lösung mit "#define MATH...irgendwas" gesehen, 
was den entsprechenden Abschnitt in math.h dann aktiviert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.