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
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...
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
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' ??
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".
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.
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.
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.