Forum: Compiler & IDEs Prolbem AVRStudio mit GCC und Log10 ??


von Patrick (Gast)


Lesenswert?

Hi,

ich habe ein Problem mit dem integrierten Compiler GCC in AVRStudio
mit SP2. In meiner Funktion gibt es eine Zeile mit Log10:

logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);

In AVR Studio wird dies angemeckert:

../megaSHT.c:285: undefined reference to `log10'

mit einem externen Makefile geht es aber ohne Probleme.

Das gleiche hab ich auch noch mit:
dtostrf(dew_point,3,1,buf);

megaeib.o(.text+0xdc6):../megaeib.c:373: undefined reference to
`dtostrf'

Was mach ich da falsch?

Gruss Patrick

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

-lm fehlt.

von Patrick (Gast)


Lesenswert?

Hallo,

hab ich bei den Custom Options dazugepackt, geht leider immer noch
nicht. Ich bekomme die gleiche Fehlermeldung?

Gruss patrick

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Denk dran, dass die Bibliotheken beim Linken am Ende (nach den
.o-Dateien) stehen müssen.

"custom options" klingt mir wie options beim Compilieren, da
wird sie nicht gebraucht.

Mach doch mal 'n Bugreport in Trondheim auf, damit -lm standard-
mäßig mit in die Linkeroptionen aufgenommen wird.  Es schadet
nichts, wenn es drin ist und nicht gebraucht wird.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Diesbezüglich könnte man* sich übrigens etwas von Microsoft abgucken,
was wohl ganz praktisch ist:

Ein

  #pragma comment(lib, "bla")

im Quelltext (also auch in einer Headerdatei) sorgt dafür, daß der
Linker automatisch mit der Library bla.lib (MS-äquivalent von .a)
linkt.

Hier böte es sich an, in den Headerdateien, die Funktionen wie log10
deklarieren, ebenjenes #pragma unterzubringen.



*) "man" bezieht sich auf die Leute, die gcc pflegen und
weiterentwickeln

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

GCC benutzt ohnehin keine Pragmas (außer den vom Standard
vorgeschriebenen), und meines Wissens gibt's das vorhandene
Objektformat auch gar nicht her, dass man diese Information
an den Linker weiterreichen könnte.

Aber: was ich für die avr-libc auf Dauer vorhabe ist, die libm.a
komplett fallen zu lassen und alles in die libc.a zu integrieren.
(Eine leere libm.a werden wir trotzdem mitliefern, damit alle
diejenigen, die aus Gewohnheit -lm drin stehen haben, nicht auf
die Nase fallen.)

von Patrick (Gast)


Lesenswert?

Also, ich verstehe nur Bahnhof..

ich wollte das neue AVR Studio verwenden in dem der GCC schon eingebaut
wird. Dabei gibt es im Menüe einen Knopf in dem man die Optionen
einstellen kann. Darin gibt es auch die Custom Option.

Seltsam ist meine Deklaration der Lib's:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <inttypes.h>
#include <avr/iom128.h>
#include <inttypes.h>
#include <avr/delay.h>
#include <stdio.h>
#include <math.h>
#include <compat/ina90.h>


dabei ist ja die Log10 Funktion in der math.h.
kommentiere ich die aus:

//#include <math.h>

erscheint die gleiche Fehlermeldung, so als ob der Compiler die Lib
nicht verwendet?

Gruss Patrick

von Patrick (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

hab im Anhang mal den Code gepackt in dem die Log10 Funktion drin
ist..
vieleicht kann mir jemand helfen?

Gruss Patrick

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

@Patrick:
Du verwechselst Headerdateien und Libraries.

Die Headerdatei math.h enthält nur Deklarationen (Funktionsprototypen),
damit der Compiler Funktionsaufrufe korrekt übersetzen kann. Da steht
gewissermaßen nur drin, daß es eine Funktion namens log10 gibt,
welchen Typ ihre Argumente und Rückgabewert haben, aber nicht deren
Implementierung (der Code, der tatsächlich rechnet).
Das kannst Du Dir auch ansehen, Headerdateien sind ganz normale
Textdateien.

Der Compiler erzeugt aus Deiner Quelltextdatei eine Objektdatei, in der
wiederum (in binärer Form) eine Tabelle von externen Symbolen aufgeführt
ist. Das sind all die Funktionen, von denen dem Compiler mitgeteilt
wurde (oder von denen er es unter Ausgabe von Warnungen selbst
angenommen hat), daß sie irgendwo anders existieren.
log10 ist so ein Kandidat.

Erst der Linker "verheiratet" Deine erzeugte Objektdatei mit dem Code
der Implementierung der Funktion log10 - und die ist in einer Library
namens libm.a enthalten.

Gcc-spezifisch ist diese Namensgebung von Libraries - ihr Name fängt
immer mit "lib" an und ihre Extension ist .a. Bei der Angabe der zu
verwendenden Libraries (mit -l) wird im Makefile das "lib"
weggelassen.
So wird aus libm.a ein einfaches "m" und also lautet die  Dir
fehlende Option "-lm".

Wird's jetzt allmählich klarer?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Habe mir eben mal ein AVR Studio ,,geborgt''.

Ist doch ganz einfach: in den Projekteigenschaften gibt's links
so ein Kindergartenbildchen, unterschrieben mit "Libraries".
Darin steht unter "Available libraries" u. a. eine libm.a.  Die
wählst du bitte aus.

von Patrick (Gast)


Lesenswert?

Danke für den Tipp, nach dem Einbinden der Lib geht es.
zumindest übersetzt AVR Studio nun das Programm, laufen tut es aber
immer noch nicht. hab eine Schleife im Programm:

while (!bAckFlag) {
    ; //wait..
  }

diese klappt aber nicht wenn ich in AVRStudio übersetzte, mein Programm
bleibt dabei immer hängen. Mit einem externen Makefile geht es?

Gruss Patrick

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?


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.