Forum: Mikrocontroller und Digitale Elektronik STM32 programm mit FLOAT Zahlen


von Gast2 (Gast)


Lesenswert?

Hallo,

In meinem Projekt muss ich float Zahlen benutzen, aber beim Linken 
erhalte ich folgende Fehler:

undefined reference to `__aeabi_ui2f'
undefined reference to `__aeabi_fdiv'
:  :  :  :  :
GNU ld (Sourcery G++ Lite 2008q1-126) 2.18.50.20080215

Ich starte den Linker mit folgendem Kommando:

arm-none-eabi-ld -v -lgcc 
-LC:/WinARM/CodeSourcery/lib/gcc/arm-none-eabi/4.2.3/thumb 
-Tprj/STM32F103CB-ROM.ld -Map=main.map out/lib/src/cortexm3_macro.o 
out/src/main.o out/src/stm32f10x_it.o out/src/stm32f10x_vector.o 
out/src/analogout.o --output main.elf

Der Pfad vom Parameter -L existiert, die Datei libgcc.a ebenfalls.

Ich habe auch schon in der LD-Datei den Parameter "SEARCH_DIR()" anstatt 
-L gesetzt, hatauch nicht geholfen.
Wenn ich den -l Parameter falsch schreibe, dann sagt er, er würde die 
Datei nicht finden, also die Datei libgcc.a findet er. Die Funktionen 
"__aeabi_ui2f" usw. sind auch drin.

Hat jemand eine Idee warum es nicht geht?
Vielen Dank im Voraus.

von Andreas K. (a-k)


Lesenswert?

Häng das -lgcc mal hinter die Liste von *.o Files.

von Gast2 (Gast)


Lesenswert?

Vielen Dank Hr. Kaiser, jetzt gehts !!!!
Ein netter kleiner Bug von arm-none-eabi-ld.

von Andreas K. (a-k)


Lesenswert?

Das ist kein Bug, sondern eine 4 Jahrzehnte alte Tradition der Linker in 
Unix-Systemen und deren Verwandten.

Die heisst: Was von Libraries nicht gebraucht wird fliegt raus. Strikt 
der Reihe nach von links nach rechts vorgehend. Ohne Gedächtnis. Wenn 
also erst rechts von -lgcc Fliesskommafunktionen benötigt werden, dann 
nützt es nichts (mehr), dass sie in der libgcc drin stehen.

Folglich gehören Libraries fast immer hinten dran, nicht vorneweg.

von Gast2 (Gast)


Lesenswert?

Na ja, der Linke könnte auch erst zum Schluß an das Löschen denken, und 
nicht schon am Anfang...
In jedem Fall ist es eine nützliche Info!

Wenn ich mit dem arm-none-eabi-gcc linke, dann brauche ich die libgcc.a 
nicht erst angeben, irgendwie weiß das der gcc schon von alleine. So 
klug könnte doch auch der ld sein.

von Andreas K. (a-k)


Lesenswert?

Der Linker tut genau das was man ihm sagt. Das ist sein Job, alles 
andere wäre Anmassung. Und es ist das Programm "gcc", das als einziges 
wissen kann, dass es sich um ein C Programm handelt. Und das folglich 
den "ld" mit den entsprechenden Libraries im Schlepptau aufruft.

Einfacher: Wer ohne Not "ld" direkt aufruft, kriegt was er verdient. ;-)

von Gast2 (Gast)


Lesenswert?

Gut, das hab ich nun auch verstanden. Besser ist es den gcc zum linken 
zu verwenden, der gcc ruft dann den ld auf, auch mit den libXYZ.a. Nur 
den Pfad zu den Libs, die man verwenden möchte muss der natürlich wissen 
(-L Parameter).

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.