www.mikrocontroller.net

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


Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-lm fehlt.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruss patrick

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruss Patrick

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.