Hallo! ich will die ln Funktion im Atmel Studio 6.1 verwneden. ln ist ja in C die Funktion log(). Wenn ich math.h inkludiere und log() verwende, bekomme ich beim kompillieren den fehler: undefined reference to 'log' Weiß jemand was falsch ist? LG
>bekomme ich beim kompillieren den fehler: undefined reference to 'log' > >Weiß jemand was falsch ist? Du musst die Math Library dazulinken. Das macht man in den Linkeroptionen mit -lm oder libm.a irgendwo beim Linker eingeben.
Ich habe schon einige Header files inkludiert und Funktionen davon verwendet (z.b. Compiler.h oder string.h) und nie was beim linker ferstellen müssen. Warum muss ich nun auf einmal bei math.h was beim linker einstellen?
Werner13 schrieb: > Ich habe schon einige Header files inkludiert und Funktionen davon > verwendet (z.b. Compiler.h oder string.h) und nie was beim linker > ferstellen müssen. Warum muss ich nun auf einmal bei math.h was beim > linker einstellen? Weil in der math-Library nun mal die Implementierungen dieser Funktionen stecken.
weil das nun mal bei C so ist. Zu jeder Lib gibt es auch ein Header. Die Stringfunktionen sind aber in er libc enthalten und diese wird immer mit gelinkt. mit #include bindet man keine lib ein, sondert nur ein headerfile. Die Lib muss immer dem Linker übergeben werden.
Atmel Studio: Geh auf den Menüpunkt 'Project' Im Menü das herunter klappt, ganz unten dann '"dein Projekt" Properties', wobei "dein Projekt" der Name deines Projektes ist. Alternativ kannst du auch einfach Alt+F7 drücken. Im Fenster dann in der linken Tableiste "Toolchain" In der Spalte links daneben "AVR GNU Linker" und da wiederrum den Unterpunkt "Libraries" Darauf hin siehst du zwei Eingabefelder, das obere "Libraries", das untere "Libary Search Path". Du willst das obere. Die Libary, die du haben willst hat den Namen libm.a Das willst du aber so nicht reinschreiben, denn die Namensteile 'lib' und '.a' sind obligatorisch. Du musst im Feld also einfach nur "m" eintragen.
Hmmm, keine Ahnung was du da machst oder auch nicht, aber hier mal ein Code-Snippet der bei mir in Atmel Studio 6.1 fehlerfrei* funktioniert, ohne irgendwas an den Linkeroptionen oder sonst wo rumfummel zu müssen.
1 | #include <math.h> |
2 | |
3 | int main(void) |
4 | {
|
5 | double x = 0; |
6 | while(1) |
7 | {
|
8 | x=log(345.678); |
9 | }
|
10 | }
|
(*fehlerfrei: abgesehen von "warning: variable x set, but not used" ) Grüße
hier wird vermutlich schon wegoptimiert. Sind ja alles Konstanten. Teste mal mit
1 | int main(void) |
2 | {
|
3 | volatile double x = 0; |
4 | volatile double d = 3.14; |
5 | while(1) |
6 | {
|
7 | x=log(d); |
8 | }
|
9 | }
|
Karl Heinz schrieb: > Das sieht dann so aus. Bei mir siehst standardmäßig immer so aus. Peter II schrieb: > hier wird vermutlich schon wegoptimiert. In meinem Beispiel ist die Optimierung abgeschaltet. Im Simulator bekommt x den wert 5.845508
Peter II schrieb: > hier wird vermutlich schon wegoptimiert. Kann auch sein, dass bei ihm die libm.a standardmässig schon eingetragen ist. Bei mir war sie es (oder ich bin mir nicht mehr bewusst, dass ich die mal eingetragen hätte). Auf jeden Fall kein Beinbruch, wenn man sich in den Konfigurationsoptionen mal ein wenig umsieht.
Allenfalls moechte man die Float Library nicht hinzugelinkt haben, da klotzig. Der Logarithmus laesst sich auch zu Fuss fuer Integer erledigen
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.