大佬教程收集整理的这篇文章主要介绍了发现 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,请注明来意。