Forum: Mikrocontroller und Digitale Elektronik Logarithmus in Atmel Studio


von Werner13 (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>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.

von Werner13 (Gast)


Lesenswert?

Wo kann ich denn das im Atmel Studio einstellen?

von Werner13 (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

Das sieht dann so aus.

von Kaj (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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
}

von Kaj (Gast)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Werner13 (Gast)


Lesenswert?

Alles klar, Danke!

von nochwas (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.