Math.h fehlt unter Linux

Hallo,
ich mache gerade die ersten Schritte, unter Linux C zu programmieren.
Bei einem Programm verwende ich die math.h, um einen sinus zu berechnen. Leider wird dieser Befehl aber nicht anerkannt:

_bernhard@Cycnus:~/Cprogrammierung$ gcc sinusberechnung.c
/tmp/cciiYJkt.o(.text+0x73): In function `main’:

undefined reference to `sin’

collect2: ld returned 1 exit status_

Ich führe diesen Fehler darauf zurück, daß die Bibliothek math.h, die ich mit

#include

eingebunden habe, fehlt. Aber das ist auch nur eine Annahme.
Ich habe die neueste Version von libc6-dev, daran sollte es also nicht liegen.
Mir ist aber aufgefallen, daß „man math“ oder „man math.h“ nicht funktioniert.

Wie könnte ich an dieser Stelle weitermachen? Ich würde mein Programm gerne fertigprogrammieren.

Viele Grüße, und hoffentlich kennt sich da jemand aus,

Bernhard

Problem gelöst! Aber warum?
Hallo,

das Problem hat sich erledigt. Ich mußte zum kompilieren anstatt

gcc sinusberechnung.c

folgendes eingeben:

gcc sinusberechnung.c -lm

Aber wozu steht lm ? Ich habe keine Hilfe dazu bekommen. Ich bin auf die Lösung in einem Buch gestoßen, in dem einfach stand, ich solle das so machen, sonst ginge das nicht.

Viele Grüße,

Bernhard

aus der „man 3 intro“ zitat:

(3M) Diese Funtionen sind in der Arithmetik Bibliothek
libm enthalten. Sie werden automatisch vom f77(1)
FORTRAN Compiler verwendet, jedoch nicht vom cc(1)
C Compiler, der dazu die Option -lm benцtigt.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Aber wozu steht lm ? Ich habe keine Hilfe dazu bekommen. Ich
bin auf die Lösung in einem Buch gestoßen, in dem einfach
stand, ich solle das so machen, sonst ginge das nicht.

Wieso hast Du keine Hilfe dazu bekommen? Dann hast Du eine unvollständige Version von GCC und solltest das schleunigst korrigieren. Sonst findest Du die (ausführliche) Hilfe nach eingeben des Kommandos

 info gcc 

Wenn Du Hilfe zur GNU C Library haben möchtest, gibt es die mit

 info libc 

Aus dem gcc-info:

-lLIBRARY
-l LIBRARY

 Search the library named LIBRARY when linking. (The second
 alternative with the library as a separate argument is only for
 POSIX compliance and is not recommended.)
 [...]

-l wird also zum linken von Bibliotheken benutzt. Der Name der Bibliothek ist der Teil, der nach dem „lib“ kommt. Bei der Mathe-Bibliothek „libm“ bliebt nur das „m“.

Wie gesagt, ein Blick in die Dokumentation kann nicht schaden.

Gruß

Fritze

generell zu header-dateien
Hallo Bernhard,

mit #include werden keine Bibliotheken dazugebunden, sondern die angegebene Datei wird einfach nur vor dem Compilieren in den Quelltext einkopiert.

In einer .h datei ist auch normalerweise kein code sonder nur Deklarationen von Variablen und Funktionen. z.B. die sin-funktion. Du kannst nach math.h suchen, und den inhalt in Dein Programm kopieren. Das kommt aufs selbe raus wie #include . Du kannst Auch nur die Deklaration der sin-funktion suchen und rauskopieren. Das reicht evt. acuh.
Diese dateien dienen also nicht dazu, dass die Funktion in Dein Programm kommt, sondern nur dazu dass sie RICHTIG in Dein Programm kommt. Es ist nämlich wichtig für den Compiler, welchen Typ die Argumente haben, und der Returnvalue. Die Funktion selber ist in einer Library.

Später, beim sogenannten LINKEN stellt der LINKER fest, dass Du gar keine FUnktion sin in Deinem Code hast. Dann schaut er (mit richtiger Option) auch noch in der mitgelieferten LIbrary nach, ob dort vielleicht eine Funktion sin ist und linkt diese hinzu. Ob Du math.h eingebunden hast, interessiert diesen nicht.

Hallo,

das Problem hat sich erledigt. Ich mußte zum kompilieren
anstatt

gcc sinusberechnung.c

folgendes eingeben:

gcc sinusberechnung.c -lm

Aber wozu steht lm ? Ich habe keine Hilfe dazu bekommen. Ich
bin auf die Lösung in einem Buch gestoßen, in dem einfach
stand, ich solle das so machen, sonst ginge das nicht.

sin() ist nicht in der libc drinnen, sondern in libm, das ist eine Mathematikbibliotek. mit „-lm“ linkt er /usr/lib/libm.so dazu.

Viele Grüße,

Bernhard