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