0
此makefile用于为ARM微控制器生成hex文件。我的makefile将保存在文件夹中的所有c文件并生成hex文件。十六进制文件,.obj文件等被放置在bin文件夹中。Makefile不适用于多个c文件,但适用于单个c文件
当文件夹内只有一个c文件时,我的makefiles工作正常(即能够看到十六进制文件,.obj文件等)。但如果我在文件夹中放置多个c文件,则构建失败。下面是我有多个c文件时得到的错误。
arm-none-eabi-gcc: error: main.o: No such file or directory
make: *** [32bitTimer.elf] Error 1
我附上我的makefile以供参考。
请让我知道为什么它不适用于多个c文件?
## makefile
BINARY = 32bitTimer
LDSCRIPT = stm32f4-discovery.ld
SRCS = $(wildcard *.c)
OBJDIR = bin
PREFIX = arm-none-eabi
CC = $(PREFIX)-gcc
LD = $(PREFIX)-gcc
OBJCOPY = $(PREFIX)-objcopy
OBJDUMP = $(PREFIX)-objdump
GDB = $(PREFIX)-gdb
TOOLCHAIN_DIR ?= ../libopencm3
CFLAGS += -Os -g \
-Wall -Wextra -Wimplicit-function-declaration \
-Wredundant-decls -Wmissing-prototypes -Wstrict-prototypes \
-Wundef -Wshadow \
-I$(TOOLCHAIN_DIR)/include \
-fno-common -mcpu=cortex-m4 -mthumb \
-mfloat-abi=hard -mfpu=fpv4-sp-d16 -MD -DSTM32F4
LDFLAGS += --static -lc -lnosys -L$(TOOLCHAIN_DIR)/lib \
-L$(TOOLCHAIN_DIR)/lib/stm32/f4 \
-T$(LDSCRIPT) -nostartfiles -Wl,--gc-sections \
-mthumb -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16
OBJS = $(SRCS:.c=.o)
# Be silent per default, but 'make V=1' will show all compiler calls.
ifneq ($(V),1)
Q := @
endif
all: $(OBJDIR) $(BINARY).images
%.images: %.elf
$(Q)$(OBJCOPY) -Obinary $(OBJDIR)/$(*).elf $(OBJDIR)/$(*).bin
$(Q)$(OBJCOPY) -Oihex $(OBJDIR)/$(*).elf $(OBJDIR)/$(*).hex
$(Q)$(OBJCOPY) -Osrec $(OBJDIR)/$(*).elf $(OBJDIR)/$(*).srec
$(Q)$(OBJDUMP) -S $(OBJDIR)/$(*).elf > $(OBJDIR)/$(*).list
$(BINARY).elf: $(OBJS) $(LDSCRIPT) $(TOOLCHAIN_DIR)/lib/libopencm3_stm32f4.a
$(Q)$(LD) -o $(OBJDIR)/$(BINARY).elf $(OBJDIR)/$(OBJS) -lopencm3_stm32f4 $(LDFLAGS)
%.o:%.c
$(Q)$(CC) $(CFLAGS) -o $(OBJDIR)/[email protected] -c $<
$(OBJDIR):
$(Q)mkdir $(OBJDIR)
clean:
$(Q)rm -rf $(OBJDIR)
.PHONY: images clean
非常感谢分类!有效。 – robomon
还有一个问题。你能回答吗?每次做make时,即使源文件没有改变,文件也会被一次又一次地编译。根据我的理解,make只会编译仅被更改的文件。当我们第一次运行make时,它会生成十六进制文件。但下一次,如果我们跑步,它应该显示一些警告说:“没有规则制定目标”(我不记得确切的警告)。你知道它为什么没有显示吗?是否因为我在与源代码不同的文件夹中构建了十六进制? – robomon
如果没有更多信息,很难分辨发生了什么。考虑发布另一个问题,所以你可以用例子的makefile代码和运行的脚本来补充这个问题。 – danfuzz