2016-06-18 18 views
0

Я использую toolchain arm-none-eabi-gcc onlinux, и у меня возникают проблемы с созданием архивов, которые ссылаются на другие архивы. В качестве конкретного примера, базовый архив (libstm32f4_hal.a) должен иметь функцию HAL_SPI_GetState и с помощью nm, кажется, что он делаетКак я могу избежать неопределенных символов при связывании библиотек друг с другом с помощью arm-none-eabi-ar

$ nm libstm32f4_hal.a 
stm32f4xx_hal_spi.o: 
... 
0000158d T HAL_SPI_GetState 
00001495 T HAL_SPI_IRQHandler 
00000271 T HAL_SPI_Init 
... 

Затем я хочу сделать еще один архив (libstm32f4_bsp.a), который делает использование libstm32f4_hal.a. Второй архив выглядит правильно, но когда я пытаюсь установить связь с этими библиотеками, компоновщик выдает следующую ошибку.

cube/Drivers/BSP/STM32F4-Discovery/libstm32f4_bsp.a(stm32f4_discovery.o): In function `SPIx_Init': 
cube/Drivers/BSP/STM32F4-Discovery/stm32f4_discovery.c:313: undefined reference to `HAL_SPI_GetState' 

Когда я проверяю libstm32f4_bsp.a с помощью nm, на самом деле функция HAL_SPI_GetState не определена.

$ nm libstm32f4_bsp.a 
stm32f4_discovery.o: 
... 
     U HAL_SPI_GetState 
     U HAL_SPI_Init 
... 

Вот файл makefile, который я использую для создания второго архива.

CC=arm-none-eabi-gcc 
AR=arm-none-eabi-ar 

HAL_DIR = ../../STM32F4xx_HAL_Driver 

########################################### 

vpath %.c 

CFLAGS = -g -O2 -Wall 
CFLAGS += -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork 
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 
CFLAGS += -ffreestanding -nostdlib 

CFLAGS += -I$(HAL_DIR)/Inc 
CFLAGS += -I../../CMSIS/Device/ST/STM32F4xx/Include 
CFLAGS += -I../../CMSIS/Include 

SRCS = stm32f4_discovery.c stm32f4_discovery_accelerometer.c stm32f4_discovery_audio.c 


OBJS = $(SRCS:.c=.o) 

.PHONY: all clean 

all: libstm32f4_bsp.a 

%.o : %.c 
    $(CC) $(CFLAGS) -c -o [email protected] $^ -L$(HAL_DIR) -lstm32f4_hal 

libstm32f4_bsp.a: $(OBJS) 
    $(AR) -rvs [email protected] $(OBJS) 

clean: 
    rm -f $(OBJS) libstm32f4_bsp.a 

Может кто-нибудь объяснить, почему это может произойти? Я был бы рад предоставить более подробную информацию, но я относительно неопытен с тем, что я пытаюсь сделать здесь, и не совсем уверен, что еще будет полезно.

Контекст: я пытаюсь создать демонстрационный код для платы STM32F4-Discovery. Он в основном устанавливает плату, чтобы действовать как USB-мышь. Поскольку стек USB огромен, мой план состоит в том, чтобы создать слой абстракции аппаратного обеспечения (HAL) в качестве архива, а затем создать промежуточное программное обеспечение для конкретной платы в виде архива, связанного с архивом HAL, а затем в моей последней сборке ссылка на демонстрационный код эти два архива.

Спасибо за помощь.

EDIT:

Вот Makefile, я использую для создания проекта.

# STM32 Makefile for GNU toolchain and openocd 
# 
# This Makefile fetches the Cube firmware package from ST's' website. 
# This includes: CMSIS, STM32 HAL, BSPs, USB drivers and examples. 
# 
# Usage: 
# make cube  Download and unzip Cube firmware 
# make program  Flash the board with OpenOCD 
# make openocd  Start OpenOCD 
# make debug  Start GDB and attach to OpenOCD 
# make dirs  Create subdirs like obj, dep, .. 
# make template  Prepare a simple example project in this dir 
# 
# Copyright 2015 Steffen Vogel 
# License http://www.gnu.org/licenses/gpl.txt GNU Public License 
# Author Steffen Vogel <[email protected]> 
# Link  http://www.steffenvogel.de 
# 
# edited for the STM32F4-Discovery 

# A name common to all output files (elf, map, hex, bin, lst) 
TARGET  = demo 

# Take a look into $(CUBE_DIR)/Drivers/BSP for available BSPs 
BOARD  = STM32F4-Discovery 
BSP_BASE = stm32f4_discovery 

OCDFLAGS = -f board/stm32f4discovery.cfg 
GDBFLAGS = 

#EXAMPLE = Templates 
EXAMPLE = Demonstrations 

# MCU family and type in various capitalizations o_O 
MCU_FAMILY = stm32f4xx 
MCU_LC  = stm32f401xc 
MCU_MC  = STM32F407xx 
MCU_UC  = STM32F407VG 




# Your C files from the /src directory 
SRCS  = main.c 
SRCS  += system_$(MCU_FAMILY).c 
SRCS  += stm32f4xx_it.c 

# Basic HAL libraries 
#SRCS  += stm32f4xx_hal_rcc.c stm32f4xx_hal_rcc_ex.c stm32f4xx_hal.c stm32f4xx_hal_cortex.c stm32f4xx_hal_gpio.c $(BSP_BASE).c 

# USB .c 
SRCS  += usbd_conf_template.c usbd_core.c usbd_ctlreq.c usbd_ioreq.c 
SRCS  += usbd_hid.c 
SRCS  += usbd_desc.c 
SRCS  += stm32f4xx_hal_pcd.c 

SRCS  += stm32f4_discovery_accelerometer.c stm32f4xx_hal_tim.c 

# Directories 
OCD_DIR = /usr/share/openocd/scripts 

CUBE_DIR = cube 

BSP_DIR = $(CUBE_DIR)/Drivers/BSP/$(BOARD) 
HAL_DIR = $(CUBE_DIR)/Drivers/STM32F4xx_HAL_Driver 
CMSIS_DIR = $(CUBE_DIR)/Drivers/CMSIS 

DEV_DIR = $(CMSIS_DIR)/Device/ST/STM32F4xx 

CUBE_URL = http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/stm32cubef4.zip 

# that's it, no need to change anything below this line! 

############################################################################### 
# Toolchain 

PREFIX  = arm-none-eabi 
CC   = $(PREFIX)-gcc 
AR   = $(PREFIX)-ar 
OBJCOPY = $(PREFIX)-objcopy 
OBJDUMP = $(PREFIX)-objdump 
SIZE  = $(PREFIX)-size 
GDB  = $(PREFIX)-gdb 

OCD  = openocd 

############################################################################### 
# Options 

# Defines 
DEFS  = -D$(MCU_MC) -DUSE_HAL_DRIVER 

# Debug specific definitions for semihosting 
DEFS  += -DUSE_DBPRINTF 

# Include search paths (-I) 
INCS  = -Itemplate/inc 
INCS  += -I$(BSP_DIR) 
INCS  += -I$(CMSIS_DIR)/Include 
INCS  += -I$(DEV_DIR)/Include 
INCS  += -I$(HAL_DIR)/Inc 

# USB .h 
INCS  += -I$(CUBE_DIR)/Middlewares/ST/STM32_USB_Device_Library/Core/Inc 
INCS  += -I$(CUBE_DIR)/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Inc 

# Library search paths 
LIBS  = -L$(CMSIS_DIR)/Lib 

# Compiler flags 
CFLAGS  = -Wall -g -std=c99 -Os 
CFLAGS += -mlittle-endian -mcpu=cortex-m4 -march=armv7e-m -mthumb 
CFLAGS += -mfpu=fpv4-sp-d16 -mfloat-abi=hard 
CFLAGS += -ffunction-sections -fdata-sections 
CFLAGS += $(INCS) $(DEFS) 

CFLAGS += -mthumb-interwork 

# Linker flags 
LDFLAGS = -Wl,--gc-sections -Wl,-Map=$(TARGET).map $(LIBS) -Ttemplate/$(MCU_LC).ld 

# Enable Semihosting 
LDFLAGS += --specs=rdimon.specs -lc -lrdimon 

# Source search paths 
VPATH  = ./template/src 
VPATH  += $(BSP_DIR) 
VPATH  += $(HAL_DIR)/Src 
VPATH  += $(DEV_DIR)/Source/ 

VPATH  += $(CUBE_DIR)/Middlewares/ST/STM32_USB_Device_Library/Core/Src 
VPATH  += $(CUBE_DIR)/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Src 

OBJS  = $(addprefix template/obj/,$(SRCS:.c=.o)) 
DEPS  = $(addprefix template/dep/,$(SRCS:.c=.d)) 

# Prettify output 
V = 0 
    Q = @ 
    P = > /dev/null 
endif 

################################################### 

.PHONY: all dirs program debug template clean 

all: $(TARGET).elf 

-include $(DEPS) 

dirs: template/dep template/obj cube 
template/dep template/obj template/src template/inc: 
    @echo "[MKDIR] [email protected]" 
    $Qmkdir -p [email protected] 

template/obj/%.o : %.c | dirs 
    @echo "[CC]  $(notdir $<)" 
    $Q$(CC) $(CFLAGS) -c -o [email protected] $< -MMD -MF template/dep/$(*F).d -L$(HAL_DIR) -lstm32f4_hal -L$(BSP_DIR) -lstm32f4_bsp 

$(TARGET).elf: $(OBJS) 
    @echo "[LD]  $(TARGET).elf" 
    $Q$(CC) $(CFLAGS) $(LDFLAGS) template/src/startup_$(MCU_LC).s $^ -o [email protected] -L$(HAL_DIR) -lstm32f4_hal -L$(BSP_DIR) -lstm32f4_bsp 
    @echo "[OBJDUMP] $(TARGET).lst" 
    $Q$(OBJDUMP) -St $(TARGET).elf >$(TARGET).lst 
    @echo "[SIZE] $(TARGET).elf" 
    $(SIZE) $(TARGET).elf 

openocd: 
    $(OCD) -s $(OCD_DIR) $(OCDFLAGS) 

program: all 
    $(OCD) -s $(OCD_DIR) $(OCDFLAGS) -c "program $(TARGET).elf verify reset" 

debug: 
    @if ! nc -z localhost 3333; then \ 
     echo "\n\t[Error] OpenOCD is not running! Start it with: 'make openocd'\n"; exit 1; \ 
    else \ 
     $(GDB) -ex "target extended localhost:3333" \ 
      -ex "monitor arm semihosting enable" \ 
      -ex "monitor reset halt" \ 
      -ex "load" \ 
      -ex "monitor reset init" \ 
      $(GDBFLAGS) $(TARGET).elf; \ 
    fi 

cube: 
    rm -fr $(CUBE_DIR) 
    wget -O /tmp/cube.zip $(CUBE_URL) 
    unzip /tmp/cube.zip 
    mv STM32Cube* $(CUBE_DIR) 
    chmod -R u+w $(CUBE_DIR) 
    rm -f /tmp/cube.zip 

template: cube template/src template/inc 
    cp -ri $(CUBE_DIR)/Projects/$(BOARD)/$(EXAMPLE)/Src/* template/src 
    cp -ri $(CUBE_DIR)/Projects/$(BOARD)/$(EXAMPLE)/Inc/* template/inc 
    cp -i $(DEV_DIR)/Source/Templates/gcc/startup_$(MCU_LC).s template/src 
    cp -i $(CUBE_DIR)/Projects/$(BOARD)/$(EXAMPLE)/TrueSTUDIO/STM32F4-DISCO/$(MCU_UC)_FLASH.ld template/$(MCU_LC).ld 

clean: 
    @echo "[RM]  $(TARGET).elf"; rm -f $(TARGET).elf 
    @echo "[RM]  $(TARGET).map"; rm -f $(TARGET).map 
    @echo "[RM]  $(TARGET).lst"; rm -f $(TARGET).lst 
    @echo "[RMDIR] template/dep"   ; rm -fr template/dep 
    @echo "[RMDIR] template/obj"   ; rm -fr template/obj 

rm: 
    rm -rf template 
ifeq ($V, 0) 

Это неудачная ссылка.

`arm-none-eabi-gcc -Wall -g -std=c99 -Os -mlittle-endian -mcpu=cortex-m4 -march=armv7e-m -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -Itemplate/inc -Icube/Drivers/BSP/STM32F4-Discovery -Icube/Drivers/CMSIS/Include -Icube/Drivers/CMSIS/Device/ST/STM32F4xx/Include -Icube/Drivers/STM32F4xx_HAL_Driver/Inc -Icube/Middlewares/ST/STM32_USB_Device_Library/Core/Inc -Icube/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Inc -DSTM32F407xx -DUSE_HAL_DRIVER -DUSE_DBPRINTF -mthumb-interwork -Wl,--gc-sections -Wl,-Map=demo.map -Lcube/Drivers/CMSIS/Lib -Ttemplate/stm32f401xc.ld --specs=rdimon.specs -lc -lrdimon template/src/startup_stm32f401xc.s template/obj/main.o template/obj/system_stm32f4xx.o template/obj/stm32f4xx_it.o template/obj/usbd_conf_template.o template/obj/usbd_core.o template/obj/usbd_ctlreq.o template/obj/usbd_ioreq.o template/obj/usbd_hid.o template/obj/usbd_desc.o template/obj/stm32f4xx_hal_pcd.o template/obj/stm32f4_discovery_accelerometer.o template/obj/stm32f4xx_hal_tim.o -o demo.elf -Lcube/Drivers/STM32F4xx_HAL_Driver -lstm32f4_hal -Lcube/Drivers/BSP/STM32F4-Discovery -lstm32f4_bsp' 

Я загрузил проект GitHub here в случае, если кто мотивирован достаточно, чтобы попытаться построить сам проект. В качестве побочного примечания я запускаю Arch linux.

+1

Если это файл make-файла для библиотеки, которая успешно строится, то что такое команда makefile/build для того, что _doesn't_ работает? – Notlikethat

+0

И 'libstm32f4_hal.a', и' libstm32f4_bsp.a' успешно создаются. Проблема заключается в том, что 'libstm32f4_bsp.a' использует функции из' libstm32f4_hal.a', но эти функции не определены в 'libstm32f4_bsp.a' (хотя сборка работает без ошибок). – user2027202827

+1

Ну, да, вы создали две отдельные библиотеки, одна из которых имеет зависимость от другой. Отсюда интерес к тому, действительно ли _third_ вещь связывается с обоими из них и [в правильном порядке] (http://stackoverflow.com/a/24675715/1356926) для загрузки. – Notlikethat

ответ

2

неисправной команда была что-то вроде

arm-none-eabi-gcc ...-mcpu=cortex-m4 .. template/obj/main.o \ 
-lstm32f4_hal ... -lstm32f4_bsp 

И вашего libstm32f4_hal.a архива функции HAL_SPI_GetState определена, и эта функция используется libstm32f4_bsp.a архива.

Итак, у вас неправильный порядок архивов в вашей команде связывания. Вы должны знать, что линкер (ld, который обычно вызывается НКОЙ сделать фактический шаг связующего) работает на входные архивах (.a файлов) слева направо, проверить человек страницу ld(1) на http://linux.die.net/man/1/ld

Normally, an archive is searched only once in the order that it is specified on the command line.

Вы можете попробуйте изменить порядок архивов hal и bsp (-lstm32f4_bsp ... -lstm32f4_hal), но если он тоже не работает, тогда у вас есть круговая зависимость.Вы можете отметить библиотекам несколько раз в команде связующей (-lstm32f4_bsp ... -lstm32f4_hal -lstm32f4_bsp), или просто поручить линкер перебрать подсписок архивов с -( и -) или --start-group и --end-groupопции компоновщика, как описано в человеке и в https://stackoverflow.com/a/5651895/196561. Параметры должны быть размещены вокруг библиотек с циклическими зависимостями: --start-group -lstm32f4_bsp ... -lstm32f4_hal --end-group

Полного описанием опций от man page of ld

-(archives -) --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.

При использовании GCC для вызова компоновщика, используйте -Wl, префикс для передачи опций линкера, если ваши НКУ не признают их: -Wl,--start-group -lstm32f4_bsp ... -lstm32f4_hal -Wl,--end-group

при использовании оболочки/сделать, вам, возможно, придется процитировать ( и ) в сокращенном варианте вариантов, например, с одинарными кавычками: '-Wl,-(' -lstm32f4_bsp ... -lstm32f4_hal '-Wl,-)'

+0

Возможно, вы можете быть прав насчет ссылки. Я пробовал все предложенные вами модификации, но все равно получаю ошибки. Мне нужно ложиться спать прямо сейчас, но, надеюсь, еще раз посмотрим на это завтра. Спасибо, что пытались помочь. Я отправил проект в github на случай, если вы захотите сами его создать: https://github.com/hobenkr88/ArmUsb – user2027202827

+0

Хорошо, мне удалось передать '-Wl, - start-group -lstm32f4_bsp .... ... -Wl, - end-group'. Я также сделал, как было предложено в другом комментарии, и передал архивы в форме 'ABAB', которая проверила, что вы были правы, чтобы меня отменили порядок, в котором я передавал свои архивы. К сожалению, у меня все еще есть проблема связывания, но на вопрос в другом направлении, чем то, что я просил, поэтому я, вероятно, в конечном итоге начну новый вопрос, чтобы обратиться к этому, поскольку добавление к этому вопросу будет путаницей для всех, у кого есть подобные проблемы. Спасибо за вашу помощь. – user2027202827

 Смежные вопросы

  • Нет связанных вопросов^_^