muyunqinggezero 2023-05-03 15:28 采纳率: 75.9%
浏览 24

Makefile问题

关于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 $@

这是我的项目目录

img


我的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文件 一个一个对应编译太麻烦了。请问大家如何解决我的问题。

  • 写回答

1条回答 默认 最新

  • 赵4老师 2023-05-05 14:14
    关注

    提醒:makefile里的tab字符必须是真正的tab字符,不能用若干个空格代替。
    搜“跟我一起写Makefile”

    评论

报告相同问题?

问题事件

  • 修改了问题 5月3日
  • 创建了问题 5月3日

悬赏问题

  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 划分vlan后不通了
  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大