stm32 arm-none-eabi-gcc链接库

时间:2014-09-23 16:22:56

标签: arm stm32

您好我需要在我的stm32上计算对数。我使用arm-none-eabi-gcc。当我在Makefile微控制器中添加-L/opt/tools/Sourcery_G++_Lite/arm-none-eabi/lib/时停止工作。不幸的是我无法调试我的程序,因为我的设备上没有debag引脚,我通过bootloader将程序加载到flash。我不使用库中的任何数学函数 - 我只是将库路径添加到Makefile。 这是我的完整makefile:

OUTPUTDIR = $(BUILDDIR)/../../output

DEPDIR = $(BUILDDIR)/.dep
PWD = $(shell pwd)

COMMONFLAGS = -mcpu=cortex-m3 -mthumb -ggdb3
CFLAGS += $(COMMONFLAGS) -Os $(INCLUDES) -I.
CFLAGS += -std=c99 -Wall -Wextra -static -fdata-sections -ffunction-sections -fno-hosted -fno-builtin
CFLAGS += -nostdlib -nodefaultlibs
CFLAGS += -mapcs-frame -msoft-float
CFLAGS += -MD -MP -MF $(DEPDIR)/$(@F).d
LDFLAGS = $(COMMONFLAGS) -static
LDFLAGS += -fno-exceptions -ffunction-sections -fdata-sections
LDFLAGS += -static -Xlinker --gc-sections
#LDFLAGS +=  -L/opt/tools/dima/Sourcery_G++_Lite/arm-none-eabi/lib/
ASFLAGS = $(COMMONFLAGS)

CFLAGS += -DUSE_STDPERIPH_DRIVER

CROSS = /opt/tools/Sourcery_G++_Lite/bin/arm-none-eabi
GCC = $(CROSS)-gcc
AS = $(CROSS)-as
SIZE = $(CROSS)-size
OBJCOPY = $(CROSS)-objcopy
OBJDUMP = $(CROSS)-objdump
NM = $(CROSS)-nm

COBJ = $(addprefix $(BUILDDIR)/, $(CSRC:.c=.c.o))
ASMOBJ = $(addprefix $(BUILDDIR)/, $(ASMSRC:.s=.s.o))
OBJ = $(COBJ) $(ASMOBJ)

V = $(if $(VERBOSE), , @)


all: prebuild $(BUILDDIR)/$(TARGET).elf $(LDSCRIPT)
    @$(SIZE) $(BUILDDIR)/$(TARGET).elf
    @$(OBJCOPY) -O binary $(BUILDDIR)/$(TARGET).elf $(BUILDDIR)/$(TARGET).bin
    @$(OBJCOPY) -O ihex $(BUILDDIR)/$(TARGET).elf $(BUILDDIR)/$(TARGET).hex
    @$(OBJDUMP) -h -S -z $(BUILDDIR)/$(TARGET).elf > $(BUILDDIR)/$(TARGET).lss
    @$(NM) -n $(BUILDDIR)/$(TARGET).elf > $(BUILDDIR)/$(TARGET).sym
    @mkdir -p $(OUTPUTDIR)
    @cp $(BUILDDIR)/$(TARGET).bin $(OUTPUTDIR)
    @echo =======================================================================


$(BUILDDIR)/$(TARGET).elf: $(OBJ)
    @echo Linking $@
    $(GCC) $(LDFLAGS) -T $(PWD)/$(LDSCRIPT) -o $@ $(OBJ) -lm

$(COBJ): $(BUILDDIR)/%.c.o : %.c
    @echo Compiling $<
    @-mkdir -p $(@D)
    $(GCC) $(CFLAGS) -c $< -o $@

$(ASMOBJ): $(BUILDDIR)/%.s.o : %.s
    @echo Assembling $<
    @-mkdir -p $(@D)
    $(V)$(AS) $(ASFLAGS) -c ./$< -o $@


-include $(shell mkdir -p $(DEPDIR) 2>/dev/null) $(wildcard $(DEPDIR)/*)

.PHONY: clean output

clean:
    rm -rf $(BUILDDIR)

我做错了什么?感谢。

2 个答案:

答案 0 :(得分:2)

对于这个库目录,您将简单地链接到multilib中的错误文件集,并最终链接到ARM代码,而您的MCU只能执行THUMB代码。正确的文件集应位于CortexM3μC的thumb2子目录中。

请注意,使用arm-none-eabi-gcc进行链接时,Sourcery G ++ lite会自动添加正确的库目录,而Makefile似乎已经这样做了。

答案 1 :(得分:1)

你真的不应该手动链接libm.a而你真的不应该手动硬编码库路径......如果你使用arm-none-eabi-gcc,这一切都会自动完成(并且正确)或-g ++)链接并给出正确的标志(-mcpu和-mthumb)。所以只需删除所有这些路径&#34; -lm&#34;它必须工作。您可以尝试我的ARM微控制器示例项目之一 - makefile(和链接器脚本)中的设置使所有这些工作正常 - 无需用户干预。 http://www.freddiechopin.info/en/download/category/6-examples

另外 - 我认为问题的一部分可能出在你使用的这些标志中:-fno-hosted -fno-builtin -nostdlib -nodefaultlibs - 最后一个特别阻止libm.a的这种自动链接。