Hallo,
ich habe irgendwie Probleme im AVR Studio 4 mit SP 3
die float printf lib einzubinden. Weis jemand wie das geht?
Oder muss ich das makefile selbstständig bearbeiten.
Woher ich das wies das diese nicht richtig eingebunden wird?
folgendes:
sprintf(out,"%f",test);
uart0_puts(out);
Mit dem mfile Editor der beim WinAvr dabei ist funktioniert der obige
Code und test welches ein double ist wird ordentlich in ein string
gewandelt und über die uart ausgegeben.
Jetzt nehme ich die selben Quelldateien und lege einfach nur ein AVR
Studio projekt damit an. Das Avr Studio macht sich ja dann sein eigenes
makefile und der Code funktioniert nicht mehr.
Was mache ich falsch?
Danach gehst du dann noch in die allgemeinen Optionen und fügst
als Linkeroption hinzu
-Wl,-u,vfprintf
Keine Ahnung, warum AVR Studio das nicht bequemer für den Benutzer
zugänglich gemacht hat... Gleichfalls für -lm (libm.a), die sollten
sie einfach mal immer mit linken (ja, du auf jeden Fall, micro1!).
> Warum ich auf jeden fall die libm mitlinken?
Weil du sie für den korrekten Gleitkommacode auch dann brauchst,
wenn du keine Funktionen aus <math.h> benutzen willst, siehe
https://savannah.nongnu.org/bugs/?func=detailitem&item_id=3485
Wie geschrieben, diese Bibliothek sollte man einfach immer mit
drin stehen haben -- wenn man nichts davon braucht, kostet es
auch nichts. (So macht es übrigens das Template-Makefile von
Mfile.)
Achso. Ok alles klar.
Aber dann nochmal ne frage.
Das was Karl Heinz Buchegger geschrieben hat das wies ich auch.
Dort habe ich ja auch die libs hinzugefügt das reicht also nicht?
Was bewrikt aber dann das hinzufügen unter dieser Option?
Wenn das eh nichts bringt wozu ist dies dan da?
Für irgenetwas muss das ja gut sein die Option oder?
Ich muss also noch folgende Zeilen unter costum option hinzufügen?
-Wl,-u,vfprintf // fpr printf float lib
-lm // für libm
oder?
> das reicht also nicht?
Ja, das reicht (leider) nicht. Konnte Karl Heinz nicht wissen.
> Was bewrikt aber dann das hinzufügen unter dieser Option?> Wenn das eh nichts bringt wozu ist dies dan da?
Du hast das falsch verstanden: du brauchst beides, die
Bibliothek, die Karl Heinz erwähnt hat und die Option -u,vfprintf.
> Ich muss also noch folgende Zeilen unter costum option hinzufügen?> -Wl,-u,vfprintf // fpr printf float lib
Ja, die als custom linker option. Sie bewirkt, dass der Linker
das Symbol vfprintf als undefiniert auf die Reise gegeben bekommt,
sodass er es aus einer Bibliothek auflösen muss. Die -lprintf_flt
Option dann benennt die Bibliothek, in der sich die Gleitkomma-
Version der Routine vfprintf() befindet, und da das Symbol vorher
explizit als undefiniert festgelegt worden ist, wird es in diesem
Moment und aus dieser Bibliothek gelinkt.
Das -Wl,-u,vfprintf brauchst du lediglich dann nicht, wenn du in
deiner Applikation vfprintf() selbst aufrufst (dann bewirkt die
Referenz aus deiner Applikation bereits dasselbe). Es ist nämlich
lediglich diese Funktion, die sich zwischen den drei Implementie-
rungsvarianten unterscheidet, alle anderen Funktionen der printf-
Familie greifen auf diese Funktion zurück. Wenn du nun die
Option -Wl,-u,vfprintf nicht angegeben hast und deine Applikation
z. B. printf() benutzt, dann passiert folgendes:
. Der Linker hat das Symbol printf als undef markiert bekommen.
. Die Bibliothek libprintf_flt.a wird verarbeitet; sie bietet
lediglich das Symbol vfprintf, das ist aber im Moment gar
nicht gefragt, also wird aus dieser Bibliothek nichts gelinkt
. Die Standardbibliothek (libc.a) wird verarbeitet. Sie löst
das gefragte Symbol printf auf, wobei das Linken des ent-
sprechenden Objektmoduls einen neuen undef für vfprintf
erzeugt. Der Linker hat jetzt aber schon lange vergessen,
dass libprintf_flt.a dafür eine Auflösung hätte, aber libc.a
hat ja ebenfalls eine (die Standardvariante ohne Gleitkomma):
also wird diese jetzt gelinkt.
. Das Ergebnis ist dann so, als hättest du -lprintf_flt gar nicht
angegeben.
Mittlerweile ist mir ein besserer Trick eingefallen, mit dem man
diese Krücke nicht mehr braucht (libprintf_flt und libprintf_min
müssen einfach die anderen Module der Familie ebenfalls nochmal
mit aufnehmen), aber das muss ich erstmal implementieren.
> -lm // für libm
Das musst du nicht unbedingt als custom option angeben, hier kannst
du auch die normale Bibliotheksauswahl von AVR Studio benutzen.
Kommt auf das gleiche raus.
Ok. Allesklar das werde ich morgen ausprbieren und schauen ob es dann
funktioniert. Wenn nicht werde ich einfach nicht mehr mit dem AVR
Studio areiten sondern wieder auf das mfile creater zurückgriefen
und mit einem beliebigem editor programmieren. Dann funktioniert alles
auch wieder.
Es ist halt nur schon alles direkt im AVR Studio machen zu können.
Ich glaube, du kannst AVR Studio auch sagen, dass du dein
Makefile extern erstellst. Kenn mich da aber nicht aus, ich
hab' kein Windows und finde AVR Studio ziemlich gruselig zu
bedienen.
Du musst das ganze in den Linker Options eintragen!
Das ist von Atmel etwas verwirrend gemacht worden, geb ich zu.
Im Configuration Options Dialog:
Custom Options auswählen.
Im linken der beiden Listboxen den Eintrag '[Linker Options]
selektieren.
Jetzt die geforderten Einträge hinzufügen
@Karl
Das könnte es sein. Ich habe es nämlich in den Optionen für alles
eingetragen. Das Feld wo die Linker kommandos eingetragen sind ist ler.
Ich werde es mal ausprobieren.
Eine eigene Frage?
Dieser Thread ist über 20 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.