gpt4 book ai didi

c - Makefile 不适用于多个 c 文件,但适用于单个 c 文件

转载 作者:行者123 更新时间:2023-11-30 15:40:58 25 4
gpt4 key购买 nike

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

当文件夹内只有一个 c 文件时,我的 makefile 工作正常(即我能够看到 hex 文件、.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)/$@ -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) 的值,后跟斜杠。

关于c - Makefile 不适用于多个 c 文件,但适用于单个 c 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20751759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com