生成文件不适用于多个 c 文件,但适用于单个 c 文件



此生成文件用于为 ARM 微控制器制作十六进制文件。我的 makefile 获取文件夹中保存的所有 c 文件并生成十六进制文件。十六进制文件,.obj文件等放置在bin文件夹中。

当文件夹中只有一个 c 文件时,我的 makefile 工作正常(即我能够看到十六进制文件、.obj 文件等)。但是如果我在文件夹中放置多个 c 文件,构建将失败。以下是我有多个 c 文件时收到的错误。

arm-none-eabi-gcc: error: main.o: No such file or directory
make: *** [32bitTimer.elf] Error 1

我正在附加我的制作文件以供参考。

你能告诉我为什么它不适用于多个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)/$@ -c $<
$(OBJDIR):
    $(Q)mkdir $(OBJDIR)
clean:
    $(Q)rm -rf $(OBJDIR)
.PHONY: images clean

这可能是最直接的问题: 在$(Q)$(LD) -o $(OBJDIR)开始的行上,您有文本:

$(OBJDIR)/$(OBJS)

这并没有达到您(似乎)的期望。这只是将 $(OBJDIR) 的字符串值附加到 $(OBJS) 的字符串值。它实际上并不是在后者中的每个单词前面加上前缀。你可能想这样说:

$(patsubst %,$(OBJDIR)/%,$(OBJS))

它将在$(OBJS)的每个单词前面加上 $(OBJDIR) 的值,后跟斜杠。

最新更新