Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: GNUARM и плавающая точка
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Fish
Предыстория:
Установил GCC-4.1 toolchain для Cygwin, изучаю новую для себя среду разработки.
Этап "Hello world!" прошел успешно. Решил собрать тест с плавающей точкой, в котором присутствует вот такая функция:
Код
float foo(float a)
{
    a += 40.0;
    return (a * 2.1);
}

Я прочел, что функции для работы с плавающей точкой имеются в библиотеке libgcc.a. Но, первым делом я запутался в какой директории ее искать? Из какого бы места я не пробовал бы ее подлинковать, получаю такое сообщение линковщика:
Код
"C:/Program files/GNUARM"/bin/arm-elf-ld -L"C:/Program files/GNUARM"/lib/gcc/arm-elf/4.1.0/interwork -lgcc -Map D:/Projects/test1/Debug/list/test1.map -TD:/Projects/test1/src/linker.ld D:/Projects/test1/Debug/obj/main.o D:/Projects/test1/Debug/obj/crt.o -o D:/Projects/test1/Debug/bin/test1.out
D:/Projects/test1/Debug/obj/main.o: In function `foo':
D:/Projects/test1/src/main.c:155: undefined reference to `__addsf3'
D:/Projects/test1/src/main.c:156: undefined reference to `__extendsfdf2'
D:/Projects/test1/src/main.c:156: undefined reference to `__muldf3'
D:/Projects/test1/src/main.c:156: undefined reference to `__truncdfsf2'
gnumake: *** [test1.out] Error 1

Причем в map-файле вижу следующее:
Код
Linker script and memory map

LOAD C:/Program files/GNUARM/lib/gcc/arm-elf/4.1.0/interwork/libgcc.a
                0x00000000                ROMSTART = 0x0
                0x00010000                ROMSIZE = 0x10000
-------------вырезано---------------
startup
*(.startup)

.text           0x00000000      0x794
*(.text)
.text          0x00000000      0x6a0 D:/Projects/test1/Debug/obj/main.o
                0x0000040c                put
                0x0000068c                UNDEF_handler
                0x0000049c                print
                0x00000000                InitHW
                0x00000254                DAC_setup
                0x00000678                SWI_handler
                0x00000664                FIQ_handler
                0x0000060c                IRQ_handler
                0x000001b0                UART0_setup
                0x00000284                ADC_setup
                0x0000015c                InitVIC
                0x000005b0                AD0_ISR
                0x00000354                T1_setup
                0x00000560                main
                0x000004e8                foo
                0x000005a0                DefDummyInterrupt
.text          0x000006a0       0xe0 D:/Projects/test1/Debug/obj/crt.o
                0x000006a0                _startup
*(.rodata)
.rodata        0x00000780       0x14 D:/Projects/test1/Debug/obj/main.o
*(.rodata*)
*(.glue_7)
*(.glue_7t)
                0x00000794                _etext = .

.data           0x40000200        0x0 load address 0x00000794
                0x40000200                _data = .
*(.data)
                0x40000200                _edata = .

.bss            0x40000200        0x0
                0x40000200                _bss_start = .
*(.bss)
                0x40000200                . = ALIGN (0x4)
                0x40000200                _bss_end = .
                0x40000200                _end = .

Многоуважаемые, где грабли? Я в растерянности... help.gif
beer_warrior
Есть такой ключик линкера -lm для подключения math lib.
Fish
Цитата(beer_warrior @ Jun 7 2006, 07:54) *
Есть такой ключик линкера -lm для подключения math lib.

Те же яйца sad.gif А ГДЕ эта библиотека располагается? Какой указать путь для ее поиска?
-=Space=-
у меня брались из Keila

SET PATH=C:\Micro\ARM\GNUGCC\Bin;C:\Micro\ARM\GNUGCC\Arm-Tools\Bin\
SET GCCINC=C:\Micro\ARM\keil\ARM\INC\Philips\;C:\Micro\ARM\keil\ARM\INC\
SET GCCLIB=C:\Micro\ARM\keil\ARM\LIB

ну это пходу было связано с тем что GCC входил в дистриб Keila

Кстати я здесь писал , давно правда, чт омне очень не понравилась плавающая точка c GCC
код получался тормозным и объемным
Keil компилил на порядок лучше, или либу другую использовал

А потом нам купили IAR, но это другая песня
Nicholas
Возможно я чего-то тоже не понимаю, но вроде надо ещё объектные файлы указывать? У меня компилится примерно так:
arm-elf-ld -T ldscript -L $(libpath) -o $(proj).elf *.o -lgcc
Насчёт libm наверное замечание правильное. В свое время собирал - работало, но код разрастался (хотя не очень критично). скорее всего её надо использовать. и ещё - библиотеки всегда указываются последними.
Fish
Цитата(Nicholas @ Jun 7 2006, 13:25) *
и ещё - библиотеки всегда указываются оследними.


Спасибо! Это оказалось камнем преткновения a14.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.