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,
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.
(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]
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.
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.
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.