Forum: Compiler & IDEs arm-none-eabi 6.3.1, Linker Problem, Eclipse


von Axel V. (axel-f)


Lesenswert?

System Mint 19
IDE Eclipse 2019/09

Linker findet offenbar keine passende Lib zur Einbindung der expf() 
Funktion. Die Lib für sprintf() dagegen wird gefunden.

Linkeraufruf und Fehlermeldung:

arm-none-eabi-gcc -nostartfiles -s -static --entry=Reset_Handler -T 
/home/axel/workspace/Aqualampe/flash.ld -mcpu=cortex-m3 -mthumb 
-D=__SAM3S1A__ -o "Aqualampe"  ./source/exceptions.o ./source/init.o 
./source/interrupt_sam_nvic.o ./source/light.o ./source/main.o 
./source/pio.o ./source/pio_handler.o ./source/pmc.o ./source/remote.o 
./source/startup_sam3s.o ./source/syscalls.o ./source/system_sam3s.o 
./source/tc.o ./source/uart_console.o ./source/udc.o 
./source/udi_vendor.o ./source/udi_vendor_desc.o ./source/udp_device.o
./source/light.o: In function `convert_to_log':
/home/axel/workspace/Aqualampe/Debug/../source/light.c:305: undefined 
reference to `expf'

Sachdienliche Hinweise?

Danke, Axel

von abcabc (Gast)


Lesenswert?

Ja gegen die Mathelib linken

von Axel V. (axel-f)


Lesenswert?

Oh vielen Dank! Aber bitte nicht so viel Details... -Sarkasmus off-

Zur Einbindung von sprintf() mußte ich keine extra lib angeben 
(stdlib?!). Wieso findet der Linker die lib mit den Mathefunktionen 
nicht automatisch? Gibt es da nicht diesen Mechanismus mit Lib-Loader 
(ld)?

Verschiedene Pfadangaben wie:
-L/usr/lib/arm-none-eabi/lib/thumb/v7-m

haben dem Linker jedoch nicht den richtigen Weg gewiesen.

Also abcabc, versuchen wir's nochmal, vielleicht zwei Zeilen mehr? Nur 
weil heute Silverster ist...

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Hallo Axel,

der Linker findet sie auch, wenn du ihm sagst, er solle dagegen linken.
Die Meldung besagt ja nur, das er die Funktion nicht finden kann.
Es gibt eine Linker-Option die verhindert, das automatisch irgendwelche 
Libs
gelinkt werden (no-stdlib oder so ähnlich).
Die solltest du verwenden und dann alle Libs die du benötigst mit der 
Option
-l[myFancyLibname] linken.
Wenn der Linker dann die Lib nicht findet, musst du den Pfad dahin 
bekannt machen mit der Option -L[/Path/to/my/libs].

Gruß und guten Rutsch
Olaf

BTW:
Gab es vielleicht auch Compiler-Warnungen zu dieser Funktion?
Bitte mehr Informationen gilt auch für Dich!

: Bearbeitet durch User
von Axel V. (axel-f)


Lesenswert?

Hallo Olaf,
Danke!

Mehr Informationen? Keine Compilerwarnungen, also war er wohl mit dem 
Header
#include <math.h>
zufrieden.

Ok, Linkeroption -nodefaultlibs gibt es hier direkt im Eclipse. Nur- 
welche Lib binde ich ein?

Lib-Pfad:
/usr/lib/arm-none-eabi/lib/thumb/v7-m

Libs:
-lm
-lc

Jetzt wird es ganz furchtbar, es kommen eine Menge solcher Meldungen:
/home/axel/workspace/Aqualampe/Debug/../source/light.c:244: undefined 
reference to `__aeabi_fadd'
/home/axel/workspace/Aqualampe/Debug/../source/light.c:252: undefined 
reference to `__aeabi_i2f'
/home/axel/workspace/Aqualampe/Debug/../source/light.c:252: undefined 
reference to `__aeabi_fcmple'
/home/axel/workspace/Aqualampe/Debug/../source/light.c:255: undefined 
reference to `__aeabi_fcmplt'

Also offenbar die falschen Libs. Wie finde ich die richtigen?
Also mit den stdlibs hat er wohl die meisten Funktionen gefunden. 
sprintf wurde anstandslos compiliert und gelinkt und es funktioniert 
tadellos.
Nochmal die Frage: wo finde ich die richtigen libs, die einzubinden 
sind?

Es gibt bei mir noch einen Pfad für arm-none-eabi libs:
/usr/lib/gcc/arm-none-eabi/6.3.1/thumb/v7-m

Wenn ich den als lib Suchpfad einbinde und dazu als -lgcc, kommen obige 
massenweise Meldungen nicht mehr. Jetzt finded er lediglich sprintf und 
expf als Funktion nicht mehr:
/home/axel/workspace/Aqualampe/Debug/../source/light.c:286: undefined 
reference to `sprintf'
/home/axel/workspace/Aqualampe/Debug/../source/light.c:306: undefined 
reference to `expf'

??

von Jim M. (turboj)


Lesenswert?

Axel V. schrieb:
> Verschiedene Pfadangaben wie:
> -L/usr/lib/arm-none-eabi/lib/thumb/v7-m
>
> haben dem Linker jedoch nicht den richtigen Weg gewiesen.

Die sollte er über -mcpu=cortex-m3 -mthumb automagisch finden, da ja gcc 
als Linker Frondend benutzt wird.

Versuche mal "-lm -lc -lgcc" oder "-lc -lnosys -lm".

von Axel V. (axel-f)


Lesenswert?

Nee, wird alles nur schlimmer.
Am besten geht immer noch dieser Aufruf:
arm-none-eabi-gcc -nostartfiles -s -static 
-L/usr/lib/gcc/arm-none-eabi/6.3.1/thumb/v7-m --entry=Reset_Handler -T 
/home/axel/workspace/Aqualampe/flash.ld -mcpu=cortex-m3 -mthumb 
-D=__SAM3S1A__ -o "Aqualampe"  ./source/exceptions.o ...-lgcc

Da findet er nur die Referenz zu expf nicht.

von Carl D. (jcw2)


Lesenswert?

Das f am Ende von expf() hat zwar Ähnlichkeit mit dem f von printf(), 
aber bedeutet, daß float statt double bei exp() berechnet wird. Dies ist 
nicht Standard in C, braucht deshalb eine spezielle Mathe-Lib.

Wenn es also nicht auf Speed ankommt ("Aqualampe" lässt das vermuten) 
versuch's mal mit exp(). Bei μC's verwendet man gerne nur 32FP statt 
64FP, was an Platz und Geschwendigkeit liegen kann, aber oft auch 
einfach aus Gewohnheit.

von Markus F. (mfro)


Lesenswert?

wenn Du wissen willst, was in welcher lib steckt:

for i in /usr/lib/arm-none-eabi/lib/thumb/*.a; do arm-none-eabi-nm $i | 
grep expf; echo $i; done

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Oft hilft an der (Linux-) Kommandozeile ein "man expf".
Alternativ bei Google.
Dann bekommt man:

expf(3) - Linux man page
Name

exp, expf, expl - base-e exponential function
Synopsis

#include <math.h>

double exp(double x);
float expf(float x);
long double expl(long double x);

Link with -lm.

Aus der letzten Zeile kann man erkennen,
das die Funktion in der libm.a enthalten ist.
Die Angabe -lm reicht dem Linker, da er es automatisch mit libXXXX.a 
probiert.

Der springende Punkt ist nun, gegen die richtige Version davon zu 
linken.
Also mit HW Unterstützung, ohne selbige, 32Bit, 64Bit, etc.

Gruß
Olaf

PS: Wenn die Signatur der Funktion im Header und in der Lib nicht 
übereinstimmen, meldet der Linker immer, dass er die Funktion nicht 
auflösen kann, womit er natürlich recht hat.

PPS: Ein frohes neues Jahr euch allen! :-)

: Bearbeitet durch User
von Axel V. (axel-f)


Lesenswert?

Ein gutes Neues Jahr 2020 an alle!
Und vielen Dank zwischendurch, daß ihr euch mit meinem Problem 
beschäftigt habt!

exp() anstatt expf() hatte ich bereits mit gleichem Erfolg probiert, was 
nicht verwunderlich ist, da die Funktionen sicher in der gleichen 
Mathe-Lib stecken.

-lm scheint mir auch erfolgversprechend zu sein. Muß halt 'nur' die 
passende libm.a finden.

.......
Gelöst!! Es ist tatsächlich nur -lm, ohne jede Pfadangabe zu 
irgendwelchen Libs; daß hat den Linker offenbar nur verwirrt.
Wow, was für ein Jahresanfang- ich wünsche jedem von euch genau so einen 
Start!!


Gruß
Axel

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Hallo Axel,

freut mich das wir dir helfen konnten.

Gruß
Olaf

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.