gcc 如何修复这个“没有规则来制作目标“的错误?

ibps3vxo  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(563)

我有这个生成文件。

CC = arm-none-eabi-gcc -c
LD = arm-none-eabi-gcc
OC = arm-none-eabi-objcopy
OS = arm-none-eabi-size

TARGET = cli_stm32f4
LIBNAME_OPENCM3 = opencm3_stm32f4

OPT = -Os
DEFS += -DSTM32F4
DIR_OPENCM3 = ./libopencm3
DIR_CLI = ./embedded-cli
DIR_OBJ = ./obj
DEBUG = -ggdb3
LDSCRIPT = stm32f4.ld

DIR_FLAGS = -I$(DIR_CLI)

ARCH_FLAGS = -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16

LDFLAGS += --static -nostartfiles
LDFLAGS += -T$(LDSCRIPT)
LDFLAGS += $(ARCH_FLAGS) $(DEBUG)
LDFLAGS += -Wl,-Map=$(TARGET).map -Wl,--cref
LDFLAGS += -Wl,--gc-sections
ifeq ($(V),99)
LDFLAGS     += -Wl,--print-gc-sections
endif
LDFLAGS += -u _printf_float
LDFLAGS += -L$(DIR_OPENCM3)/lib

LDLIBS += -l$(LIBNAME_OPENCM3)
LDLIBS += -Wl,--start-group -lc -lgcc -lnosys -Wl,--end-group

CFLAGS += $(OPT) $(DEBUG) $(ARCH_FLAGS)
CFLAGS += -Wextra -Wshadow -Wimplicit-function-declaration
CFLAGS += -Wredundant-decls -Wmissing-prototypes -Wstrict-prototypes
CFLAGS += -fno-common -ffunction-sections -fdata-sections
CFLAGS += -std=c11 -MMD -MP

DEFS += -I$(DIR_OPENCM3)/include

PREPFLAGS = -MD -Wall -Wundef $(DEFS)

BINFLAGS = -O binary

OBJS = $(DIR_OBJ)/main.o \
        $(DIR_OBJ)/cli.o

all : $(TARGET).bin

$(TARGET).bin : $(OBJS) $(LDSCRIPT)
    $(LD) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $(TARGET).elf
    $(OC) $(TARGET).elf $(BINFLAGS) $@
    
$(DIR_OBJ)/%.o : %.c
    mkdir -p $(DIR_OBJ)
    $(CC) $(CFLAGS) $(DIR_FLAGS) $(PREPFLAGS) $< -o $@
    
clean :
    rm -rf $(DIR_OBJ) *.bin *.elf *.map *.d
    
-include $(OBJS:.o=.d)

我认为使用此指令将创建两个对象文件:* 主目录 * 和 * 目录 *。

OBJS = $(DIR_OBJ)/main.o \
        $(DIR_OBJ)/cli.o
  • cli.c* 和 main.c 位于不同的文件夹中。前者位于主文件夹中名为 embedded-cli 的文件夹中,后者位于主文件夹中,包含makefile。x1c 0d1xx 1c 1d 1x我已经使用此指令添加了 embedded-cli 文件夹。
DIR_FLAGS = -I$(DIR_CLI)

但我明白。
make:***没有规则来生成目标“obj/cli. o”,“cli_stm32f4.bin”需要该规则。停止。

p3rjfoxz

p3rjfoxz1#

规则如下:

$(DIR_OBJ)/%.o : %.c

意味着如果你有一个像./obj/cli.o这样的文件,你可以从一个名为cli.c的文件中构建它。但是,你没有一个名为cli.c的文件。你有一个名为embedded-cli/cli.c的文件:这不是一回事。
DIR_FLAGS这样的变量添加一些路径并不意味着要做什么:它没有告诉Maker如何查找文件。
你有两个选择:您可以为每个源目录编写不同的模式规则:

$(DIR_OBJ)/%.o : %.c
    ...
$(DIR_OBJ)/%.o : embedded-cli/%.c
    ...

或者,您可以将the VPATH variable设置为一个源目录列表,以便进行检查:

VPATH = embedded-cli

相关问题