你好,我需要在我的stm32上计算对数。我用的是手臂--没有-gcc。当我在我的Makefile微控制器中添加-L/opt/tools/Sourcery_G++_Lite/arm-none-eabi/lib/时,停止工作。不幸的是,我无法调试我的程序,因为我的设备上没有故障引脚,我通过引导加载程序将程序加载到闪存。我不使用来自库的任何数学函数-我只是向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)我做错了什么?谢谢。
发布于 2014-09-23 19:19:32
使用这个库dir,您将简单地链接到multilib中的错误文件集,并最终使用ARM代码进行链接,而您的MCU只能执行拇指代码。正确的文件集应该位于Cortex M3 C的M3子目录中。
请注意,Sourcery将在使用G++链接时自动添加正确的库dir,您的Makefile似乎已经这样做了。
发布于 2014-09-26 15:07:03
你真的不应该手动链接libm.a,也不应该手动硬编码库路径.如果您使用arm-none-eabi-gcc (或-g++)链接并给出适当的标志(-mcpu和-mthumb),所有这些都会自动完成(并且正确)。因此,只要丢弃所有这些路径和"-lm“,它就必须工作。您可以尝试我的ARM微控制器示例项目之一--makefile(和链接器脚本)中的设置可以在没有用户干预的情况下完成所有这些工作。http://www.freddiechopin.info/en/download/category/6-examples
此外,我认为问题的一部分可能在于您使用的这些标志:-fno托管的-fno-内置-nostdlib -nodefaultlibs -最后一个特别阻止了libm.a的自动链接。
https://stackoverflow.com/questions/26000061
复制相似问题