您好我需要在我的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)
我做错了什么?感谢。
答案 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的这种自动链接。