我有这个生成文件。
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”需要该规则。停止。
1条答案
按热度按时间p3rjfoxz1#
规则如下:
意味着如果你有一个像
./obj/cli.o
这样的文件,你可以从一个名为cli.c
的文件中构建它。但是,你没有一个名为cli.c
的文件。你有一个名为embedded-cli/cli.c
的文件:这不是一回事。向
DIR_FLAGS
这样的变量添加一些路径并不意味着要做什么:它没有告诉Maker如何查找文件。你有两个选择:您可以为每个源目录编写不同的模式规则:
或者,您可以将the
VPATH
variable设置为一个源目录列表,以便进行检查: