Перейти к содержанию
    

Во время линковки для STM32F100RB возникает непонятная ошибка

Использую arm-none-eabi-, make, clang, Sublime Text. До недавнего времени проект нормально собирался, но вот я решил добавить в него свою библиотеку (файлы init.cpp, init.h, spi.cpp, spi.h). Положил эти 4 файла в папку user-code в проекте,

эта папка прописана в makefile для флага -I, а также для создания объектных файлов. Самое интересное, когда я просто подключаю в главном файле (#include "init.h" #include "spi.h"), то проект нормально собирается,

а когда в main() пытаюсь использовать какую-нибудь функцию из этих библиотек, то в лог построения проекта попадает вот такая ошибка:

 

--- linking...
arm-none-eabi-gcc .\out\obj/system_stm32f10x.o .\out\obj/core_cm3.o .\out\obj/stm32f10x_exti.o .\out\obj/stm32f10x_gpio.o .\out\obj/stm32f10x_spi.o .\out\obj/misc.o .\out\obj/stm32f10x_rcc.o .\out\obj/main.o .\out\obj/spi.o .\out\obj/init.o .\out\obj/startup_stm32f10x_md_vl.o -mcpu=cortex-m3 -mthumb -Wl,-Map=".\out\lst\ARM-testENC28J60.map",--cref -Wl,--gc-sections -TSTM32F10X_MD_VL.ld -nostartfiles -o .\out\hex\ARM-testENC28J60.elf
c:/program files (x86)/gnu tools arm embedded/bin/../lib/gcc/arm-none-eabi/4.9.3/armv7-m\libgcc.a(unwind-arm.o): In function `get_eit_entry':
unwind-arm.c:(.text+0x154): undefined reference to `__exidx_start'
unwind-arm.c:(.text+0x158): undefined reference to `__exidx_end'
c:/program files (x86)/gnu tools arm embedded/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc.a(lib_a-abort.o): In function `abort':
abort.c:(.text.abort+0xa): undefined reference to `_exit'
c:/program files (x86)/gnu tools arm embedded/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc.a(lib_a-signalr.o): In function `_kill_r':
signalr.c:(.text._kill_r+0xe): undefined reference to `_kill'
c:/program files (x86)/gnu tools arm embedded/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc.a(lib_a-signalr.o): In function `_getpid_r':
signalr.c:(.text._getpid_r+0x0): undefined reference to `_getpid'
collect2.exe: error: ld returned 1 exit status
make[1]: *** [.\out\hex\ARM-testENC28J60.elf] Error 1
makefile:252: recipe for target '.\out\hex\ARM-testENC28J60.elf' failed
make[1]: Leaving directory 'D:/4 electronics/soft/Sublime Text projects/ARM-testENC28J60'
makefile:203: recipe for target 'all' failed
make: *** [all] Error 2
[Finished in 1.8s with exit code 2]

Микроконтроллер - STM32F100RB.

Сборка SublimeText (портабельная, со всеми программами) лежит тут: https://copy.com/kJIDxc8rIJenEWm4

Как преодолеть такую вот ошибку?

 

Весь проект лежит на гитхаб тут: https://github.com/r44083/ARM-testENC28J60

Изменено пользователем r44083

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Забавно. А зачем использовать эти функции? Что, например, должно произойти, когда в теле какой-нибудь функции будет вызван exit()?

Если нужно перезагрузить МК, то запустите, например, watchdog или еще каким-нибудь образом в функции _exit() выполняйте reset (скажем, какую-нибудь GPIO подключить ко входу RESET).

С функцией kill тоже веселуха: у вас же не RTOS! Зачем здесь сигналы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а когда в main() пытаюсь использовать какую-нибудь функцию из этих библиотек, то в лог построения проекта попадает вот такая ошибка:

Небось, виртуальные деструкторы используете? :)

Решение вот тут: ссылка.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Небось, виртуальные деструкторы используете? :)

Решение вот тут: ссылка.

Виртуальные функции я не использую, это очень простые обычные библиотеки.

Я подключил, ваш файл к проекту и ситуация немного изменилась. Теперь возникает другая ошибка при линковке:

c-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libc.a(lib_a-signalr.o): In function `_getpid_r':
signalr.c:(.text._getpid_r+0x0): undefined reference to `_getpidmakefile:252: recipe for target '.\out\hex\ARM-testENC28J60.elf' failed
'
collect2.exe: error: ld returned 1 exit status
make[1]: *** [.\out\hex\ARM-testENC28J60.elf] Error 1
make: *** [all] Error 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, я уже глянул.

Верните ключи -fno-exceptions и -fno-rtti.

Вернул эти флаги и проект построился. Просто замечательно.

Было выявлено, что к вышеописанной ситуации приводило отсутствие флага "-fno-exceptions".

Пока на работе просто скомпилировал, но на микроконтроллере не проверял. Приду домой и проверю, также почитаю как именно он влиял на сборку и приводил к такой ошибке.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...