关于Makefile方面的相关问题。我想通过makefile的模式将.c文件生成对应的.o文件。
这是我这部分的代码,这个无法执行,echo也没有显示。只是给我报错No rule to make target 'obj/drv_lcd.o', needed by 'Test'. Stop.
$(OBJDIR)/%.o:$(SRCDIR)/%.c
@echo "Source file: $<"
@echo "Target file: $@"
@echo Compiling $< ...
$(CC) -c $< -o $@ $(CFLAGS)
我如果通过单独编译文件,可以正确编译项目。单独编译文件如下
$(OBJDIR)/drv_lcd.o: ../Driver/Src/drv_lcd.c
$(CC) $(CFLAGS) -c $< -o $@
$(OBJDIR)/drv_gpio.o: ../Driver/Src/drv_gpio.c
$(CC) $(CFLAGS) -c $< -o $@
$(OBJDIR)/drv_delay.o: ../Driver/Src/drv_delay.c
$(CC) $(CFLAGS) -c $< -o $@
$(OBJDIR)/test.o: ./Src/test.c
$(CC) $(CFLAGS) -c $< -o $@
这是我的项目目录
我的makefile全代码
#编译器选择
CC = arm-linux-gnueabihf-gcc
#目标名称
TARGET = Test
#头文件目录地址
IDIR = -I ../Driver/Inc \
-I ./Inc \
#-I../Middleware/gui/u8g2/csrc \
###################################源文件目录地址########################################################################
#Driver SRCDIR
SRCDIR = ../Driver/Src
#Test SRCDIR
SRCDIR += ./Src
########################################################################################################################
#生成对象文件目录地址
OBJDIR = ./obj
#生成目标目录地址
OUTDIR = ./bin
#编译时配置项
CFLAGS= $(IDIR) -W -Wall -D __ARM_LINUX__
#查看源文件并生成目标文件列表
#$(addsuffix pattern,text) 用于向 text 字符串后面添加指定的 pattern 字符串。
#wildcard 是通配符函数,通过它可以得到我们所需的⽂件,这个函数类似我们在 Windows 或Linux 命令⾏中的“*”
SRCS := $(wildcard $(addsuffix /*.c, $(SRCDIR)))
#$(patsubst pattern, replacement, text) 将所有的.c文件替换为.o
OBJS := $(patsubst %.c, $(OBJDIR)/%.o, $(notdir $(SRCS)))
all : directories $(TARGET)
directories :
@mkdir -p $(OBJDIR)
@mkdir -p $(OUTDIR)
$(info IDIR = $(IDIR))
$(info SRCDIR = $(SRCDIR))
$(info OBJDIR = $(OBJDIR))
$(info OUTDIR = $(OUTDIR))
$(info CFLAGS = $(CFLAGS))
$(info SRCS = $(SRCS))
$(info OBJS = $(OBJS))
$(TARGET): $(OBJS)
@echo Generating $(TARGET) ...
$(CC) -o $(OUTDIR)/$@ $^
# $(OBJDIR)/drv_lcd.o: ../Driver/Src/drv_lcd.c
# $(CC) $(CFLAGS) -c $< -o $@
# $(OBJDIR)/drv_gpio.o: ../Driver/Src/drv_gpio.c
# $(CC) $(CFLAGS) -c $< -o $@
# $(OBJDIR)/drv_delay.o: ../Driver/Src/drv_delay.c
# $(CC) $(CFLAGS) -c $< -o $@
# $(OBJDIR)/test.o: ./Src/test.c
# $(CC) $(CFLAGS) -c $< -o $@
$(OBJDIR)/%.o:$(SRCDIR)/%.c
@echo "Source file: $<"
@echo "Target file: $@"
@echo Compiling $< ...
$(CC) -c $< -o $@ $(CFLAGS)
# $(info IDIR = $(IDIR))
# $(info SRCDIR = $(SRCDIR))
# $(info OBJDIR = $(OBJDIR))
# $(info OUTDIR = $(OUTDIR))
# $(info CFLAGS = $(CFLAGS))
# $(info SRCS = $(SRCS))
# $(info OBJS = $(OBJS))
# $(OBJS) : $(SRCS)
# @echo Compiling $< ...
# $(CC) -c $(SRCS) -o $(OBJS) $(CFLAGS)
# $(info SRCS = $(SRCS))
# $(info OBJS = $(OBJS))
# $(info II = $^)
.PHONY : clean
clean:
@echo RM -rf $(OBJDIR)/
@$(info OBJ = $(OBJDIR))
@rm -rf $(OBJDIR)
@echo RM -rf $(OUTDIR)/
@$(info OBJ = $(OUTDIR))
@rm -rf $(OUTDIR)
这个能成功编译。可是我想通过第一种方式,因为后期会有很多的C文件 一个一个对应编译太麻烦了。请问大家如何解决我的问题。