math.h ??
-
Hallo, wollte eben ein bsp. Programm compilieren das die math.h enthält..
leider bekomme ich immer die folgende Fehlermledung:strige@localhost:~/c++/uebungen> gcc ue_06.c -lncurses
ue_06.c: In function ‘main’:
ue_06.c:25: warning: return type of ‘main’ is not ‘int’
/tmp/ccyS3iYN.o: In functionmain': ue_06.c: (.text+0x2db): undefined reference to
sqrt'
ue_06.c: (.text+0x4c9): undefined reference tosqrt' ue_06.c: (.text+0x5fd): undefined reference to
sqrt'
collect2: ld returned 1 exit statuswo müsste die math.h in Linux sein?
in usr/include ist sie drin! und in der datei auch ("#include <math.h>")
oder mache ich was falsch beim compilieren?mfg Strige
-
hallo,
die fehlermeldung hat nichts mit der math.h zutun. die math.h wurde schon richtig eingebunden allerdings fehlt dem linker etwas. du solltest gegen die math-library linken. das machst du mit der zusätzlichen option -lm beim compiler (in den meisten fällen wohl der gcc).außerdem sollte deine main-methode als return-type int haben.
blan
-
Danke hat geklappt
das mit intmain () ist mir mittlerweile klar, mache das auch so wenn ich selber programme schreibe, das war aber ein beispielprogramm das ich natürlich nicht verändert habe...
ähm das mit dem -lm brauche ich nur für die mathe.h oder für andere Headerdateien auch? oder wo gibts dazu ne info damit ich dann in zukunft nicht wegen jeder einzelen headerdatei nachfragen muss
danke vlg
strige
-
strige schrieb:
ähm das mit dem -lm brauche ich nur für die mathe.h oder für andere Headerdateien auch? oder wo gibts dazu ne info damit ich dann in zukunft nicht wegen jeder einzelen headerdatei nachfragen muss
Das brauchst Du nicht für die Header, sondern für die Libraries.
-lm linkt zur libm, analog dazu würde bspw. -lUnixIstGut zur libUnixIstGut linken.
-
aber z.B bei string.h brauche ich ja nicht linken oder?
ich glaube, das habe ich grundsätzlich noch nicht kapiert
-
strige schrieb:
aber z.B bei string.h brauche ich ja nicht linken oder?
ich glaube, das habe ich grundsätzlich noch nicht kapiertNein.
Solange du nur Dinge aus der ISO C (wie string.h etc.) und POSIX Standard _bis auf_ math.h nimmst, musst du idr nichts explizit linken, da die Library in der die entsprechenden Implementierungen stecken im Normalfall automatisch dazu gelinkt wird (libc). math.h ist aus irgend einem Grund eine Ausnahme (aber auch nicht bei C++ :)). (Ich denke mal, dass das historische Gründe hat bzw. für Systeme ohne hardware Fließkommaunterstützung gedacht war).
Wenn du nun aber andere Bibliotheken benutzen willst, wie zB GTK+, ncurses, curl etc, musst du die Bibliothek ebenfalls explizit linken!
-
ah ok, Danke, ich glaube jetzt geht mir langsam ein Lichtlein auf
-
strige schrieb:
aber z.B bei string.h brauche ich ja nicht linken oder?
ich glaube, das habe ich grundsätzlich noch nicht kapiertBei string.h sowieso nicht. Du linkst nicht Header sondern Libraries. Wurde zwar schon erwähnt, aber Du hast es offensichtlich übersehen.
Hilfreich sind die man-Pages. Gebe ich in der Konsole "man sqrt" ein, dann steht auf der ersten Seite "Link with -lm".
Du kannst ja ruhig die math.h includieren. Wesentlich ist der Aufruf von sqrt. Du kannst sogar einfach selbst den Prototypen der Funktion schreiben und die math.h nicht includieren (nicht empfehlenswert, aber es geht) und trotzdem benötigst Du -lm.
-
achso, desheißt bei diesem beispiel ist das nur wegen der funktion sqrt(), z.B. bei anderen math.h funktionen muss ich nicht immer linken???
habe eben auch bei man math.h kein hinweiß zum linken gefunden, aber bei sqrt() wie du sagtest..
-
strige schrieb:
achso, desheißt bei diesem beispiel ist das nur wegen der funktion sqrt(), z.B. bei anderen math.h funktionen muss ich nicht immer linken???
habe eben auch bei man math.h kein hinweiß zum linken gefunden, aber bei sqrt() wie du sagtest..Das sollte bei allen Funktionen aus math.h so sein. Wenn du nur konstanten (wie M_PI etc.) benutzt, musst du nicht linken.