首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >stm32 arm-none-eabi-gcc链接库

stm32 arm-none-eabi-gcc链接库
EN

Stack Overflow用户
提问于 2014-09-23 16:22:56
回答 2查看 6.1K关注 0票数 1

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

代码语言:javascript
复制
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)

我做错了什么?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-23 19:19:32

使用这个库dir,您将简单地链接到multilib中的错误文件集,并最终使用ARM代码进行链接,而您的MCU只能执行拇指代码。正确的文件集应该位于Cortex M3 C的M3子目录中。

请注意,Sourcery将在使用G++链接时自动添加正确的库dir,您的Makefile似乎已经这样做了。

票数 2
EN

Stack Overflow用户

发布于 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的自动链接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26000061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档