logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[AT91SAM7X] AT91SAM7X: Jak użyć atanf z math.h w Yagarto? Błąd undefined reference

pawelal 19 Cze 2009 20:08 2927 11
REKLAMA
  • #1 6677716
    pawelal
    Poziom 11  
    Posty: 41
    Ocena: 3
    Witam

    Mam problem z bibliotekami, a konkretnie funkcją atanf z biblioteki math.h. Dostaję error:
    undefined reference to `atanf' 451 C/C++ Problem
    


    fragment mojego kodu:
    
    float temp_lat=0;
    float temp_long=0;
    float alfa=0;
    //...	
    
    alfa=atanf(temp_lat/temp_long);
    



    Co powinienem dodać, żeby funkcje z math.h działały? Ewentualnie bardzo proszę o pomoc w znalezieniu funkcji obliczającej arc tan.

    Korzystam z pakietu Yagarto, mikrokontroler to AT91SAM7X, jeśli ma to znaczenie.
  • REKLAMA
  • Pomocny post
    #2 6678616
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    musisz dolinkować bibliotekę matematyczną, czyli libm.a. Dokonuje się tego poprzez "-lm" dodane do komendy wywołania linkera.

    4\/3!!
  • #3 6679683
    pawelal
    Poziom 11  
    Posty: 41
    Ocena: 3
    Mam jeszcze prośbę o pomoc w tym dolinkowaniu. Z tego co znalazłem, muszę dopisać libm.a i prawdopodobnie libgcc.a do makefile-a, tylko nie wiem gdzie i jak.

    używam pliku makefile z dema freertosa:
    
    #	FreeRTOS.org V5.0.4 - Copyright (C) 2003-2008 Richard Barry.
    #
    #	This file is part of the FreeRTOS.org distribution.
    #
    #	FreeRTOS.org is free software; you can redistribute it and/or modify
    #	it under the terms of the GNU General Public License as published by
    #	the Free Software Foundation; either version 2 of the License, or
    #	(at your option) any later version.
    #
    #	FreeRTOS.org is distributed in the hope that it will be useful,
    #	but WITHOUT ANY WARRANTY; without even the implied warranty of
    #	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #	GNU General Public License for more details.
    #
    #	You should have received a copy of the GNU General Public License
    #	along with FreeRTOS.org; if not, write to the Free Software
    #	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    #
    #	A special exception to the GPL can be applied should you wish to distribute
    #	a combined work that includes FreeRTOS.org, without being obliged to provide
    #	the source code for any proprietary components.  See the licensing section 
    #	of http://www.FreeRTOS.org for full details of how and when the exception
    #	can be applied.
    #
    #	***************************************************************************
    #	See http://www.FreeRTOS.org for documentation, latest information, license 
    #	and contact details.  Please ensure to read the configuration and relevant 
    #	port sections of the online documentation.
    #	***************************************************************************
    
    CC=arm-elf-gcc
    OBJCOPY=arm-elf-objcopy
    ARCH=arm-elf-ar
    CRT0=boot.s
    DEBUG=-g
    OPTIM=-O0
    LDSCRIPT=atmel-rom.ld
    
    #
    # CFLAGS common to both the THUMB and ARM mode builds
    #
    
    CFLAGS= \
    -I.  \
    -I./USB  \
    -I./FAT  \
    -I../Source/include  \
    -I../Source/portable/GCC/ARM7_AT91SAM7S  \
    -Wall  \
    -Wextra  \
    -Wstrict-prototypes  \
    -Wmissing-prototypes  \
    -Wmissing-declarations  \
    -Wno-strict-aliasing  \
    -D SAM7_GCC  \
    -D THUMB_INTERWORK \
    -mthumb-interwork \
    -mcpu=arm7tdmi  \
    -T$(LDSCRIPT) \
    $(DEBUG)  \
    $(OPTIM) \
    -fomit-frame-pointer
    
    THUMB_FLAGS=-mthumb
    LINKER_FLAGS=-Xlinker -ortosdemo.elf -Xlinker -M -Xlinker -Map=rtosdemo.map
    
    #
    # Source files that can be built to THUMB mode.
    #
    FREERTOS_THUMB_SRC= \
      ../Source/tasks.c \
      ../Source/queue.c \
      ../Source/list.c \
      ../Source/portable/GCC/ARM7_AT91SAM7S/port.c
    
    DEMO_APP_THMUB_SRC= \
      ../Source/portable/MemMang/heap_2.c \
      main.c \
      FAT/tff.c \
      FAT/mmc.c \
      USB/USB-CDC.c
    
    #
    # Source files that must be built to ARM mode.
    #
    ARM_SRC= \
      ../Source/portable/GCC/ARM7_AT91SAM7S/portISR.c \
      USB/USBIsr.c \
      zadaniaISR.c \
      Cstartup_SAM7.c  
    
    
    #
    # Define all object files.
    #
    ARM_OBJ = $(ARM_SRC:.c=.o)
    FREERTOS_THUMB_OBJ = $(FREERTOS_THUMB_SRC:.c=.o)
    DEMO_APP_THMUB_OBJ = $(DEMO_APP_THMUB_SRC:.c=.o)
    LWIP_THUMB_OBJ = $(LWIP_THUMB_SRC:.c=.o)
    
    rtosdemo.bin : rtosdemo.elf
    	$(OBJCOPY) rtosdemo.elf -O binary rtosdemo.bin
    
    rtosdemo.hex : rtosdemo.elf
    	$(OBJCOPY) rtosdemo.elf -O ihex rtosdemo.hex
    
    rtosdemo.elf : $(ARM_OBJ) $(DEMO_APP_THMUB_OBJ) $(LWIP_THUMB_OBJ) $(FREERTOS_THUMB_OBJ) $(CRT0) Makefile FreeRTOSConfig.h
    	$(CC) $(CFLAGS) $(ARM_OBJ) $(DEMO_APP_THMUB_OBJ) $(LWIP_THUMB_OBJ) $(FREERTOS_THUMB_OBJ) -nostartfiles $(CRT0) $(LINKER_FLAGS)
    
    $(DEMO_APP_THMUB_OBJ)  : %.o : %.c $(LDSCRIPT) Makefile FreeRTOSConfig.h
    	$(CC) -c $(THUMB_FLAGS) $(CFLAGS) $< -o $@
    
    $(LWIP_THUMB_OBJ)  : %.o : %.c $(LDSCRIPT) Makefile FreeRTOSConfig.h
    	$(CC) -c $(THUMB_FLAGS) $(CFLAGS) $< -o $@
    
    $(FREERTOS_THUMB_OBJ)  : %.o : %.c $(LDSCRIPT) Makefile FreeRTOSConfig.h
    	$(CC) -c $(THUMB_FLAGS) $(CFLAGS) $< -o $@
    
    $(ARM_OBJ) : %.o : %.c $(LDSCRIPT) Makefile FreeRTOSConfig.h
    	$(CC) -c $(CFLAGS) $< -o $@
    
    clean :
    	touch Makefile
    
    


    O ile z plikami *.c czy *.h łatwo się domyślić, to jeśli chodzi o *.a nie mam pojęcia. Plik libm.a mam w katalogu
    
    C:\Program Files\Yagarto\arm-elf\lib\
    


    Z góry dziękuję za pomoc.
  • REKLAMA
  • Pomocny post
    #4 6679740
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    libgcc jest dołączane automatycznie przez linker, więc tym sie absolutnie nie przejmuj

    Zasadniczo standardowe biblioteki mają nazwę lib_.a, dzie _ to jedna lib więcej literek (libm, libgcc, itd.). Dołączenie (dolinkowanie) ich następuje poprzez dodanie "-l_" do wywołania linkera.

    Aby w twoim makefile dołączyć cokolwiek musisz edytować LINKER_FLAGS. Dodaj tam na końcu -lm i powinno działać.

    4\/3!!
  • #5 6679754
    pawelal
    Poziom 11  
    Posty: 41
    Ocena: 3
    Kompiluje się :)
    DZIĘKI!
  • #6 7405309
    voland
    Poziom 15  
    Posty: 139
    Pomógł: 6
    Ocena: 152
    a mi sie nie kompiluje... generalnie dodalem juz dawno wspominany -lm no i <math.h> w main.c a po uzyciu tan( angle ); wychodzi mi:
    arm-elf-gcc -g -Os -nostartfiles -Wl,--gc-sections -lc -lm -lc -lgcc -T"./at91lib/boards/at91sam7s-ek/at91sam7s128/flash.lds" -o bin/flash.elf obj/flash_board_cstartup.o obj/flash_cp15_asm.o obj/flash_main.o obj/flash_led.o obj/flash_stdio.o obj/flash_dbgu.o obj/flash_pio.o obj/flash_aic.o obj/flash_pio_it.o obj/flash_pit.o obj/flash_tc.o obj/flash_pmc.o obj/flash_cp15.o obj/flash_board_memories.o obj/flash_board_lowlevel.o obj/flash_twi.o obj/flash_ds18b20.o obj/flash_1wire.o obj/flash_tools.o obj/flash_pcf8583.o obj/flash_math_.o obj/flash_pilot.o obj/flash_ff.o obj/flash_sd_spi_at91.o obj/flash_fattime.o obj/flash_ccsbcs.o obj/flash_lim.o obj/flash_lam.o obj/flash_text.o obj/flash_slide.o
    obj/flash_main.o: In function `tangens':
    /home/voland/Projects/led/srcarm/main.c:36: undefined reference to `tan'
    collect2: ld returned 1 exit status
    make: *** [flash] Błąd 1

    co ciekawe moge uzywac tan sin itp ale tylko od stalych wartosci, tak jakby to to byly wbudowane transformacje kompilatora... moze jakis konflikt? ktos ma jakis pomysł?

    Dodano po 25 [minuty]:

    Dobra mam, podpowiedz byla tu:
    http://www.embeddedrelated.com/groups/lpc2000/show/8459.php
    pokombinowalem z ustawieniem -lm i śmiga.
  • REKLAMA
  • #7 7405694
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Paranoja... Jak kolejny raz będzie problem to wpiszesz biblioteki po 4x każdą? libc jest dołączane automatycznie, nie wiem po co linkować to ręcznie i to jeszcze dwa razy (-lc), właśnie przez takie głupoty masz problem. Tam ktoś jeszcze dołącza sobie libgcc i libstdc++, które również są dołączane standardowo - totalny bezsens.

    4\/3!!
  • #8 7405802
    voland
    Poziom 15  
    Posty: 139
    Pomógł: 6
    Ocena: 152
    juz wszystko działa skoro nie masz racjonalnych pomysłów ani ochoty pomóc to nie krytykuj i nie nazywaj mnie głupkiem, ludzie mają się bać zwrócić o pomoc?
  • #9 7405836
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Ależ ja mam racjonalny pomysł, który ty świadomie ignorujesz - ręczne dołączanie bibliotek, które MUSZĄ być i tak dołączone standardowo przez linker (libc, libgcc, libstdc++ i jeszcze kilka innych) jest głupotą, a co dopiero kilkukrotne. Potem właśnie wypisywane są na necie porady o tym, żeby pozmieniać ich kolejność...

    Podoba mi się też rozumowanie wg którego pisząc "przez takie głupoty masz problem" napisałem tak naprawdę "jesteś głupkiem"... Z taką logiką faktycznie zmiana kolejności bibliotek wiele daje...

    EDIT:
    Kolejny pomysł - zmień pakiet, bo ten którego używasz jest nic nie warty - w dystrybucji od CodeSourcery atanf() działa bezproblemowo bez -lm, z -lm oraz z -lc -lm -lc -lgcc. (Spokojnie możesz zinterpretować to zdanie jako groźbę i podać mnie do sądu).

    4\/3!!
  • #10 7405953
    voland
    Poziom 15  
    Posty: 139
    Pomógł: 6
    Ocena: 152
    Szkoda tej dyskusjii poporstu w zacytowanym linku byla podpowiedz aby pokombinowac z ułozeniem paramertu -lm ( w calej lini polecenia linkowania ) i to faktycznie było to czego szukałem. Oczywiscie bez powielania tego co chyba jest logiczne. A twój pomysł to to że robie gupote bo nie dziala? spoko ale to bylo chyba zawarte w moim pytaniu o pomoc tyle ze bez słowa głupota.
  • REKLAMA
  • #11 7406113
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Whatever. To że coś tam poprzestawiałeś i nagle zaczęło działać nie jest dowodem, że znalazłeś rozwiązanie. Testy na zwierzętach pokazują tą zasadę którą zastosowałeś - zwierzątkom sypano do karmnika jedzenie w losowych momentach. Po pewnym czasie zwierzęta zauważały, że np jak stoją na jednej nodze albo wydają jakiś dźwięk, to akurat coś im wpada do karmnika. To zresztą doskonale pokazuje sposób powstania kilku innych rzeczy, ale to zupełnie inny temat.

    W razie problemów przestawiaj więc biblioteki, udzielaj też tych genialnych porad innym, a na pewno świat będzie szczęśliwy.

    4\/3!!
  • #12 7595448
    niedzio_waw
    Poziom 11  
    Posty: 12
    Pomógł: 1
    Panowie, a może macie do odstąpienia jedne układ at91sam7x.. ale w obudowie BGA?
    potrzebuje do prototypu 1 sztukę... wniedzwiedz(a)gmail.com
    pozdrawiam

Podsumowanie tematu

✨ Problem dotyczył błędu "undefined reference to `atanf`" podczas korzystania z funkcji atanf z biblioteki math.h w środowisku Yagarto dla mikrokontrolera AT91SAM7X. Rozwiązaniem było dołączenie biblioteki matematycznej libm.a do procesu linkowania poprzez dodanie flagi "-lm" w parametrach linkera w pliku makefile, konkretnie w zmiennej LINKER_FLAGS. Biblioteka libgcc.a jest dołączana automatycznie i nie wymaga ręcznego dodawania. Dyskusja poruszała również kwestie prawidłowego porządku i unikania wielokrotnego dołączania standardowych bibliotek (libc, libgcc, libstdc++), które mogą powodować problemy z linkowaniem. Wskazano, że w dystrybucji CodeSourcery funkcja atanf działa bezproblemowo z lub bez flagi -lm. Ostatecznie poprawne ustawienie linkera i unikanie nadmiarowych wpisów rozwiązało problem kompilacji.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA