1

Temat: Undefined reference to cosf

#include <math.h>
#include <stdio.h>

int main()
{
    float position;
    
    float rad_angle = (10 * 3.1459)/180;
    position = 100 * cos(rad_angle);
    position = 200 * sin(rad_angle);
    
    printf("position= %f\n", position);
    
    return 0;
}

Próba kompilacji toolchain'em Thorsteena kończy się:

/usr/lib64/gcc/m68k-atari-mint/9/../../../../m68k-atari-mint/bin/ld: /tmp//ccBofFdp.o:/tmp//ccBofFdp.o:(.text+0xa): undefined reference to `cosf'
/usr/lib64/gcc/m68k-atari-mint/9/../../../../m68k-atari-mint/bin/ld: /tmp//ccBofFdp.o:/tmp//ccBofFdp.o:(.text+0x1e): undefined reference to `sinf'
collect2: error: ld returned 1 exit status

To jest dokładnie przypadek jak miałem tu:

http://www.atari.org.pl/forum/viewtopic.php?id=18467

Pomysł AdamaK z zalinkowanego tematu jak najbardziej działał, ale miał dwa ale:
- math-68881.h jak dobrze pamiętam z czymś się gryzło (podwójne deklaracje) więc jeden zestaw zahaszowałem (po czym wszystko już działało)
- wymagane FPU

Teraz wymaganie FPU nie przejdzie, a do tego zabawa z podmianą na komentowany z niektórych deklaracji math-68881.h to niefajne obejście, więc rozwiązanie raczej słabe.
Oczywiście jak to kompiluję pod linuksem to wszystko jest OK, czyli to coś w naszym toolchain'ie. Stąd pytanie, jak te kilka linijek skompilować bez żadnych obejść/hack'ów itp?

2

Odp: Undefined reference to cosf

zmień typ rad_angle na double i zobacz efekt

3

Odp: Undefined reference to cosf

Działa połowicznie, czyli 'cos' już się linkuje jak trzeba, ale 'sin' nadal przerabiany jest na 'sinf' (???)
Na razie nie wnikam dlaczego, bo jednak chciałbym tą przypadłość wyprostować. Przecież to niemożliwe że kompilator generuje kod obiektowy z którego linker nie jest w stanie skorzystać.
Muszę w jakiś sposób automatyczny przeskanować wszystkie biblioteki w poszukiwaniu sinf, cosf, tanf itp, bo przecież to musi gdzieś być (libm oczywiście ręcznie sprawdziłem)

4

Odp: Undefined reference to cosf

A próbowałeś szukać w internetach?

dodaj -lm do opcji, żeby zlinkować bibliotękę matematyczną..

What can be asserted without proof can be dismissed without proof.

5

Odp: Undefined reference to cosf

-lm oczywiście dawałem. Ale już znalazłem przyczynę, miałem starszy libm, znalazłem na stronie Thorsten'a nową wersję tej biblioteki (z lutego) i binarka się właśnie utworzyła! :)
Pozostaje pytanie dlaczego paczka z toolchain'em od Thorsten'a którą pobierałem jak montowałem sobie środowisko skrośne dawała te undefined'y. Błąd raczej wykluczam, bo funkcje trygonometryczna na Float'ach są raczej częste, więc błąd byłby pewnie dość szybko wychwycony... Nieważne, ważne, że teraz działa :)

Ostatnio edytowany przez jury (2023-07-13 07:25:36)