程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了发现 STM32:编写 makefile 以创建 src inc (etc) 目录大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_696_0@如何解决发现 STM32:编写 makefile 以创建 src inc (etC) 目录? 开发过程中遇到发现 STM32:编写 makefile 以创建 src inc (etC) 目录的问题如何解决?下面主要结合日常开发的经验,给出你关于发现 STM32:编写 makefile 以创建 src inc (etC) 目录的解决方法建议,希望对你解决发现 STM32:编写 makefile 以创建 src inc (etC) 目录有所启发或帮助;

我是一名电气工程师,在初学者/中级水平上学习了嵌入式 C。在完成了 Steve Oualline 的实用 C 编程之后,我发现 Geoffery brown 的“发现 STM32 微控制器”是一个很好的初学者嵌入式资源。我非常向任何想要学习嵌入式 C 的人推荐这条路径。

对于我的问题:discovering STM32 的作者提供了一个 Makefile 方案,其中包括一个特定于项目的 Makefile 以及一个包含所有项目目录的通用 Makefile (Makefile.common)。我真的很想将我的代码组织到 src、inc、obj 和 bin 目录中,但作者没有在 makefile 模板中提供此功能。在阅读了 Makefiles 并尝试了一些东西之后,我不知道如何使用作者提供的结构来做到这一点。我的目标是保留相同的 Makefile/Makefile.common 方案,同时在我的 .elf 构建后将我的代码组织到我的项目子文件夹中单独的 bin、src、inc 和 obj 目录中。

更简单地说,我希望我的目录结构/文件夹看起来像:

v up

上下文/我正在使用的内容: FWIW,我完整的 discoveringSTM32 存储库是 here。 特定于项目(例如“ProjectA”)的作者提供的 Makefile 如下所示:

discoveringSTM32
    Makefile.common
    ProjectA
        src
            main.c
            stuff.c
            whateverelse.c
            Makefile
        inc
            stuff.h
            whateverelse.h
        bin
            ProjectA.elf
        obj
            stuff.o
            whateverelse.o

然作者提供的 Makefile.common 看起来像

TEMPLATEROOT = ..

# compilation flags for gdb

CFLAGS  = -O1 -g 
ASFLAGS = -g 
LDliBS += -lm

# object files

OBJs =  $(STARTUp) main.o
OBJs += foo.o bar.o
OBJs += baz.o fee.o 
OBJs += fo.o fum.o

# include common make file
include $(TEMPLATEROOT)/Makefile.common

认为我理解我们定义目标文件(即 main.c 中的 main.o,foo.c 中的 foo.o)的原理,并且我们有规则从它们的依赖项创建目标文件,最终构建我的可闪存 ELF 文件。

我尝试过的东西

在谷歌搜索和阅读一些在线教程之后,我尝试像这样定义我的目录:

# name of executable

ELF=$(notdir $(CURDIR)).elf                    

# Tool path

TOolROOT="C:\Users\Robert\OneDrive\documents\GNU_ARM_TOolS\9-2020-q2-update\bin"

# library path

libroOT="C:\Users\Robert\OneDrive\documents\discoveringSTM32\STM32F10x_StdPeriph_lib_V3.5.0"

# Tools

CC=$(TOolROOT)/arm-none-eabi-gcc
LD=$(TOolROOT)/arm-none-eabi-gcc
AR=$(TOolROOT)/arm-none-eabi-ar
AS=$(TOolROOT)/arm-none-eabi-as

# Code Paths

DEVICE=$(libroOT)/librarIEs/CMSIS/CM3/DeviceSupport/ST/STM32F10x
CORE=$(libroOT)/librarIEs/CMSIS/CM3/CoreSupport
PERIPH=$(libroOT)/librarIEs/STM32F10x_StdPeriph_Driver

# Search path for standard files

vpath %.c $(TEMPLATEROOT)

# Search path for perpheral library

vpath %.c $(CORE)
vpath %.c $(PERIPH)/src
vpath %.c $(DEVICE)

# Search path for library

vpath %.c $(TEMPLATEROOT)/library/ff9/src
vpath %.c $(TEMPLATEROOT)/library/ff9/src/option
vpath %.c $(TEMPLATEROOT)/library

#  Processor specific

#PTYPE = STM32F10X_MD_VL 
PTYPE = STM32F10X_MD #try this for blue pill
LDSCRIPT = $(TEMPLATEROOT)/stm32f100.ld
STARTUP= startup_stm32f10x.o system_stm32f10x.o 

# Compilation Flags

FulLASSERT = -DUSE_FulL_ASSERT 

LDFLAGS+= -T$(LDSCRIPT) -mthumb -mcpu=cortex-m3 
CFLAGS+= -mcpu=cortex-m3 -mthumb 
CFLAGS+= -I$(TEMPLATEROOT) -I$(DEVICE) -I$(CORE) -I$(PERIPH)/inc -I.
CFLAGS+= -D$(PTYPE) -DUSE_STDPERIPH_DRIVER $(FulLASSERT)
CFLAGS+= -I$(TEMPLATEROOT)/library/ff9/src -I$(TEMPLATEROOT)/library

# Build executable 

$(ELF) : $(OBJs)
    $(LD) $(LDFLAGS) -o $@ $(OBJs) $(LDliBS)

# compile and generate dependency info

%.o: %.c
    $(CC) -c $(CFLAGS) $< -o $@
    $(CC) -MM $(CFLAGS) $< > $*.d

%.o: %.s
    $(CC) -c $(CFLAGS) $< -o $@

clean:
    rm -f $(OBJs) $(OBJs:.o=.d) $(ELF) startup_stm32f* $(CLEANOTHER)

deBUG: $(ELF)
    arm-none-eabi-gdb $(ELF)


# pull in dependencIEs

-include $(OBJs:.o=.d)

然后通配我所有的 .c 和 .o

BINDIR = bin
SRCDIR = src
OBjdiR = obj
INCDIR = inc

I +='d in $(STARTUp) 以及 STARTUP 定义的相关文件,因为我遇到了“错误:没有规则可以使目标启动_stm32f10x.o”。

我所做的最远的努力是在我的特定项目目录(例如 documents/discoveringStm32/projectA)中成功创建了一个包含 .elf 文件的 bin 目录。到达那里涉及保持作者提供的 += 目标文件方案并将 makefile.common 中的 ELF 定义修改为:

# name of executable

ELF:= $(BINDIR)/$(notdir $(CURDIR)).elf
SRC := $(wildcard $(SRCDIR)/*.C)
OBJ = $(SRC:$(SRCDIR)/%.c=$(OBjdiR)/%.o)
OBJ += $(STARTUp)

我尝试过:

ELF:= $(BINDIR)/$(notdir $(CURDIR)).elf

但这引发了错误。

通过这一切,我开始欣赏 Makefile 的复杂性。我敢肯定,一旦弄清楚这一点,我就会学到更多关于编写它们的知识。

提前感谢您的帮助!

@H_696_0@解决方法

为了允许源文件驻留在 src 中,您可以将 VPATH = $(SRCDIR)SRCDIR 的定义一起使用。 要将目标文件放在 obj 中,您必须将目录添加到 OBJS 中的文件名中,例如。 G。与OBJS := $(OBJS:%.o=$(OBJDIR)/%.o)。 编译规则头则是 $(OBJDIR)/%.o: %.c

大佬总结

以上是大佬教程为你收集整理的发现 STM32:编写 makefile 以创建 src inc (etc) 目录全部内容,希望文章能够帮你解决发现 STM32:编写 makefile 以创建 src inc (etc) 目录所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。