mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Axel V. (axel-f)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Ja gegen die Mathelib linken

von Axel V. (axel-f)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Axel,

freut mich das wir dir helfen konnten.

Gruß
Olaf

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.