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
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.
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
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.
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.
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.
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...
Vermutlich befindet sich das M_PI innerhal von #if of #ifdef, siehe oben betreffs GNU_SOURCE.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.