STM32 programm mit FLOAT Zahlen

Gast #891934
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.
#892163
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.
Gast #892264
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.
#892304
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. ;-)
Gast #892380
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren