stm32 arm none eabi gcc链接库

stm32 arm none eabi gcc链接库,arm,stm32,Arm,Stm32,你好,我需要在stm32上计算对数。我使用arm none eabi gcc。当我在Makefile中添加-L/opt/tools/Sourcery\u G++\u Lite/arm none-eabi/lib/时,微控制器停止工作。不幸的是,我无法调试我的程序,因为我的设备上没有debag引脚,我通过引导加载程序将程序加载到flash。我不使用库中的任何数学函数-我只是将库路径添加到Makefile。 这是我的完整makefile: OUTPUTDIR = $(BUILDDIR)/../../

你好,我需要在stm32上计算对数。我使用arm none eabi gcc。当我在Makefile中添加
-L/opt/tools/Sourcery\u G++\u Lite/arm none-eabi/lib/
时,微控制器停止工作。不幸的是,我无法调试我的程序,因为我的设备上没有debag引脚,我通过引导加载程序将程序加载到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)
OUTPUTDIR=$(BUILDDIR)/../output
DEPDIR=$(BUILDDIR)/.dep
PWD=$(壳牌PWD)
COMMONFLAGS=-mcpu=cortex-m3-mthumb-ggdb3
CFLAGS+=$(COMMONFLAGS)-Os$(包括)-I。
CFLAGS+=-std=c99-墙-Wextra-静态-fdata节-功能节-fno托管-fno内置
CFLAGS+=-nostlib-nodefaultlibs
CFLAGS+=-mapcs帧-msoft float
CFLAGS+=-MD-MP-MF$(DEPDIR)/$(@F).d
LDFLAGS=$(COMMONFLAGS)-静态
LDFLAGS+=-fno异常-fffunction节-fdata节
LDFLAGS+=-static-Xlinker-gc部分
#LDFLAGS+=-L/opt/tools/dima/Sourcery\u G++\u Lite/arm none-eabi/lib/
ASFLAGS=$(COMMONFLAGS)
CFLAGS+=-DUSE\u标准光驱
CROSS=/opt/tools/Sourcery\u G++\u Lite/bin/arm none-eabi
GCC=$(交叉)-GCC
AS=$(交叉)-AS
大小=$(交叉)-大小
对象复制=$(交叉)-对象复制
OBJDUMP=$(交叉)-OBJDUMP
纳米=$(交叉)-纳米
COBJ=$(addprefix$(BUILDDIR)/,$(CSRC:.c=.c.o))
ASMOBJ=$(addprefix$(BUILDDIR)/,$(ASMSRC:.s=.s.o))
OBJ=$(COBJ)$(ASMOBJ)
V=$(如果$(详细),@)
全部:预构建$(BUILDDIR)/$(TARGET).elf$(LDSCRIPT)
@$(大小)$(BUILDDIR)/$(目标).elf
@$(OBJCOPY)-O二进制$(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)
@回音=======================================================================
$(BUILDDIR)/$(TARGET.elf:$(OBJ)
@回音链接$@
$(GCC)$(LDFLAGS)-T$(PWD)/$(LDSCRIPT)-o$@$(OBJ)-lm
$(COBJ):$(BUILDDIR)/%.c.o:%.c
@回声编译$<
@-mkdir-p$(@D)
$(GCC)$(CFLAGS)-c$<-o$@
$(ASMOBJ):$(BUILDDIR)/%.s.o:%.s
@回声聚集$<
@-mkdir-p$(@D)
$(V)$(AS)$(ASFLAGS)-c./$<-o$@
-包括$(shell mkdir-p$(DEPDIR)2>/dev/null)$(通配符$(DEPDIR)/*)
.虚假:干净的输出
清洁:
rm-rf$(BUILDDIR)

我做错了什么?谢谢。

使用此库目录,您只需针对multilib中的错误文件集进行链接,并最终使用ARM代码进行链接,而MCU只能执行THUMB代码。Cortex M3µC的
thumb2
子目录中应该有一组正确的文件


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

您确实不应该手动链接libm.a,也不应该手动硬编码库路径。。。如果您使用arm none eabi gcc(或-g++)链接并提供适当的标志(-mcpu和-mthumb),所有这些都会自动(正确)完成。所以只要放下所有这些路径和“-lm”,它就一定能工作。您可以尝试我的一个ARM微控制器示例项目——makefiles(和链接器脚本)中的设置使所有这些工作都很好——无需用户干预


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

它工作!非常感谢你!当我使用以下库路径时:
LDFLAGS+=-L/opt/tools/dima/Sourcery\u G++\u Lite/arm none-eabi/lib/thumb2/
微控制器可以运行程序。你们有使用数学库中任何函数的stm32项目吗?例如,如果我调用sqrt(),我的程序就会崩溃。在这些示例中,您可以使用任何函数,并且它可以完美地工作。。。包括,调用任何函数,它工作正常。。。可能您的堆栈太小,或者使用了来自中断的函数(在我的示例中,默认情况下中断堆栈被禁用-有关详细信息,请查看链接器脚本)?您是否确保堆栈始终与8字节对齐?这是许多使用双精度类型的函数所必需的,但通常仅当在堆栈上传递此类变量时。。。尝试stm32闪烁发光二极管(或任何其他stm32版本-cl或f4)示例-它必须在那里工作。