реклама на сайте
подробности

 
 
> arm-none-eabi-gcc линковка статических бибилотек
yanvasiij
сообщение Nov 27 2015, 13:07
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Доброго времени суток!

Пытаюсь собрать из скомпилинных объектников статическую либу следующим образом:

Код
arm-none-eabi-gcc -mcpu=cortex-m3 -mlittle-endian -mthumb -Wl,--gc-section -L _output/system_stm32f4xx.o (тут много много объектников) _output/beremizProcess.o _output/startup_stm32f407xx.o -o _output/beremizStm32Port.a -lstdc++


Получаю сообщение

Код
.\beremizStm32Port/./source/src/main.cpp:39: undefined reference to `initBeremizProcess()'


Но дело в том, что эту функцию я хотел реализовать уже в приложении, которое будет использовать эту библиотеку. Что я делаю неправильно?

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
yanvasiij
сообщение Mar 31 2016, 07:21
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Снова вернулся к попыткам собрать статическую либу. Проблема так и не решилась. Достоверно выяснилось следующее:

1) Когда я добавляю syscalls.o в статическую библиотеку вместе со всем остальным, то при компиляции приложения с использованием этой либы вылазит ошибка:

CODE

c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.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/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'
c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.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/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-signalr.o): In function `_getpid_r':
signalr.c:(.text._getpid_r+0x0): undefined reference to `_getpid'
c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-writer.o): In function `_write_r':
writer.c:(.text._write_r+0x10): undefined reference to `_write'
c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-closer.o): In function `_close_r':
closer.c:(.text._close_r+0xc): undefined reference to `_close'
c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'
c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'
c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-lseekr.o): In function `_lseek_r':
lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'
c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-readr.o): In function `_read_r':
readr.c:(.text._read_r+0x10): undefined reference to `_read'
collect2.exe: error: ld returned 1 exit status


Но все перечисленные функции реализованы в syscalls.c! Почему он их не видит?!

2) Когда я исключаю из библиотеки syscalls.o и приликовываю ее на этапе компиляции приложения вместе с библиотекой, все компилируется без ошибок и прекрасно работает.

Компилирую arm-none-eabi-gcc, линкую либу arm-none-eabi-gcc-ar, линкую приложение arm-none-eabi-gcc. Флаги следующие:

CODE

#common flags
SET(COMMON_FLAGS "-mthumb")
SET(COMMON_FLAGS "${COMMON_FLAGS} -Wall")
SET(COMMON_FLAGS "${COMMON_FLAGS} -mcpu=cortex-m3")
SET(COMMON_FLAGS "${COMMON_FLAGS} -mlittle-endian")
#common compiler flags
SET(COMMON_CFLAGS "-D USE_STDPERIPH_DRIVER")
SET(COMMON_CFLAGS "${COMMON_CFLAGS} -D USE_STDPERIPH_DRIVER")
SET(COMMON_CFLAGS "${COMMON_CFLAGS} -D STM32F429_439xx")
#SET(COMMON_CFLAGS "${COMMON_CFLAGS} --specs=rdimon.specs")
#SET(COMMON_CFLAGS "${COMMON_CFLAGS} -Wl,--start-group -lgcc -lc -lm -lrdimon -Wl,--end-group")
#c-files compiler flags
SET(CMAKE_C_FLAGS "${COMMON_FLAGS} ${COMMON_CFLAGS}" CACHE INTERNAL "c compiler flags")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
#cpp-files compiler flags
SET(CMAKE_CXX_FLAGS "${COMMON_FLAGS} ${COMMON_CFLAGS}" CACHE INTERNAL "cxx compiler flags")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-threadsafe-statics")
#linker flags
SET(CMAKE_EXE_LINKER_FLAGS "${COMMON_FLAGS}" CACHE INTERNAL "exe link flags")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-section")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T ./linkScript/STM32F407ZG_FLASH.ld")


Go to the top of the page
 
+Quote Post
alx2
сообщение Apr 4 2016, 05:52
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(yanvasiij @ Mar 31 2016, 13:21) *
1) Когда я добавляю syscalls.o в статическую библиотеку вместе со всем остальным, то при компиляции приложения с использованием этой либы вылазит ошибка:

Код
c:/program files (x86)/gnu tools arm embedded/4.9 2015q2/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-abort.o): In function `abort':
abort.c:(.text.abort+0xa): undefined reference to `_exit'


Но все перечисленные функции реализованы в syscalls.c! Почему он их не видит?!

Покажите полностью команду, которая завершается приведенными Вами выше ошибками.
Покажите также (для полноты понимания ситуации) вывод команд:
objdump -a <ваша библиотека> | grep syscalls
nm <ваша библиотека> | grep _exit

Цитата(demiurg_spb @ Mar 31 2016, 17:06) *
Попробуйте поменять очерёдность включения библиотек, как ни странно, но это роялит...

Ничего странного в этом нет. Если Вы при линковке, к примеру, сначала укажете библиотеку с файлом syscalls.o, на символы которого ссылок нет, то линкер, естественно, syscalls.o из библиотеки не загрузит. А потом Вы, допустим, укажете фйл, ссылающийся на что-то из syscalls.o - и, естественно, получите ошибку "символ не определен". Точно так же очевидно, что если Вы поменяете местами этот файл с библиотекой, ошибки не будет, так как на момент чтения библиотеки у линкера уже будет неопределенная ссылка, скажем, на тот же _exit, и линкер разрешит ее загрузкой syscalls.o из библиотеки.

Сообщение отредактировал alx2 - Apr 4 2016, 05:52


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 4 2016, 09:40
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(alx2 @ Apr 4 2016, 08:52) *
Ничего странного в этом нет.
Возможно и нет, но я бы делал иначе (в два прохода, чтобы исключить подобную ситуацию на корню).

Ага! Есть такой способ:
Код
-Wl,--start-group .... ... ... .... ... -Wl,--end-group

Цитата
--start-group archives --end-group
The archives should be a list of archive files. They may be either explicit file names, or `-l' options. The specified archives are searched repeatedly until no new undefined references are created. Normally, an archive is searched only once in the order that it is specified on the command line. If a symbol in that archive is needed to resolve an undefined symbol referred to by an object in an archive that appears later on the command line, the linker would not be able to resolve that reference. By grouping the archives, they all be searched repeatedly until all possible references are resolved. Using this option has a significant performance cost. It is best to use it only when there are unavoidable circular references between two or more archives.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- yanvasiij   arm-none-eabi-gcc линковка статических бибилотек   Nov 27 2015, 13:07
- - AHTOXA   Либы собираются другой программой, arm-none-eabi-a...   Nov 27 2015, 13:23
|- - demiurg_spb   Цитата(AHTOXA @ Nov 27 2015, 16:23) Либы ...   Jan 11 2016, 15:13
|- - AHTOXA   Спасибо, запомню на будущее.   Jan 11 2016, 15:37
- - yanvasiij   Цитата(AHTOXA @ Nov 27 2015, 18:23) Либы ...   Nov 30 2015, 05:33
|- - AHTOXA   Цитата(yanvasiij @ Nov 30 2015, 10:33) Да...   Nov 30 2015, 09:32
- - Radmir   наверно забыл добавить что-то типа " --specs=...   Nov 30 2015, 08:11
- - yanvasiij   Цитата(demiurg_spb @ Jan 11 2016, 20:13) ...   Jan 14 2016, 17:58
|- - demiurg_spb   Цитата(yanvasiij @ Jan 14 2016, 20:58) h...   Jan 15 2016, 13:35
|- - demiurg_spb   Попробуйте поменять очерёдность включения библиоте...   Mar 31 2016, 11:06
- - yanvasiij   Цитата(demiurg_spb @ Mar 31 2016, 16:06) ...   Apr 1 2016, 03:58
|- - demiurg_spb   Цитата(yanvasiij @ Apr 1 2016, 06:58) При...   Apr 1 2016, 10:06
- - yanvasiij   Цитата(alx2 @ Apr 4 2016, 10:52) ... Ниче...   Apr 6 2016, 04:47


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 00:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.035 секунд с 7
ELECTRONIX ©2004-2016