makefile 子文件夹下的问题

water-moon water-moon 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
主文件夹main,子文件夹font,image
主文件夹下maikefile文件内容:

CROSS=arm-linux-
APPNAME=main

#font objs
FONTDIR = ./font
FONT_OBJS += $(FONTDIR)/font13_ASCII.o
FONT_OBJS += $(FONTDIR)/font13B_ASCII.o
FONT_OBJS += $(FONTDIR)/font16_ASCII.o
FONT_OBJS += $(FONTDIR)/font16B_ASCII.o
FONT_OBJS += $(FONTDIR)/font24_ASCII.o
FONT_OBJS += $(FONTDIR)/font24B_ASCII.o
FONT_OBJS += $(FONTDIR)/font32_ASCII.o
FONT_OBJS += $(FONTDIR)/font32B_ASCII.o
FONT_OBJS += $(FONTDIR)/hzk12.o
FONT_OBJS += $(FONTDIR)/hzk16.o
FONT_OBJS += $(FONTDIR)/hzk24.o

#image objs
IMAGEDIR = ./image
IMAGE_OBJS += $(IMAGEDIR)/image_analog.o
IMAGE_OBJS += $(IMAGEDIR)/image_analog_dbm.o
IMAGE_OBJS += $(IMAGEDIR)/image_analog_dbmv.o
IMAGE_OBJS += $(IMAGEDIR)/image_analog_dbuv.o
IMAGE_OBJS += $(IMAGEDIR)/image_buttons_background.o
IMAGE_OBJS += $(IMAGEDIR)/image_background.o
IMAGE_OBJS += $(IMAGEDIR)/image_battery_0.o
IMAGE_OBJS += $(IMAGEDIR)/image_battery_1.o
IMAGE_OBJS += $(IMAGEDIR)/image_battery_2.o
IMAGE_OBJS += $(IMAGEDIR)/image_battery_3.o
IMAGE_OBJS += $(IMAGEDIR)/image_battery_4.o
IMAGE_OBJS += $(IMAGEDIR)/image_time_background.o
IMAGE_OBJS += $(IMAGEDIR)/image_minispec.o

C_OBJS = lcd_tft.o bmp.o i2c.o main.o keyboard.o gpio.o $(FONT_OBJS) $(IMAGE_OBJS)

all: $(APPNAME)
$(APPNAME): $(C_OBJS)
$(CROSS)gcc -lpthread -o $(APPNAME) $(C_OBJS)

main.o:main.c lcd_tft.h bmp.h i2c.h keyboard.h $(FONTDIR)/font.h $(IMAGEDIR)/image.h
$(CROSS)gcc -c main.c
lcd_tft.o:lcd_tft.c lcd_tft.h $(FONTDIR)/font.h
$(CROSS)gcc -c lcd_tft.c
bmp.o:bmp.c bmp.h
$(CROSS)gcc -c bmp.c
i2c.o:i2c.c i2c.h
$(CROSS)gcc -c i2c.c
keyboard.o:keyboard.c i2c.h keyboard.h
$(CROSS)gcc -c keyboard.c
gpio.o:gpio.c gpio.h
$(CROSS)gcc -c gpio.c
$(FONT_OBJS):
cd $(FONTDIR) && $(MAKE)
$(IMAGE_OBJS):
cd $(IMAGEDIR) && $(MAKE)

clean:
rm -vf $(APPNAME) *.o *.*~ *~
cd $(FONTDIR) && make clean
cd $(IMAGEDIR) && make clean

font文件夹makefile:

CROSS=arm-linux-
C_OBJS = font13_ASCII.o font13B_ASCII.o font16_ASCII.o font16B_ASCII.o font24_ASCII.o font24B_ASCII.o font32_ASCII.o font32B_ASCII.o hzk12.o hzk16.o hzk24.o
.PHONY:font
font:$(C_OBJS)

font13_ASCII.o:font13_ASCII.c font.h
$(CROSS)gcc -c font13_ASCII.c
font13B_ASCII.o:font13B_ASCII.c font.h
$(CROSS)gcc -c font13B_ASCII.c
font16_ASCII.o:font16_ASCII.c font.h
$(CROSS)gcc -c font16_ASCII.c
font16B_ASCII.o:font16B_ASCII.c font.h
$(CROSS)gcc -c font16B_ASCII.c
font24_ASCII.o:font24_ASCII.c font.h
$(CROSS)gcc -c font24_ASCII.c
font24B_ASCII.o:font24B_ASCII.c font.h
$(CROSS)gcc -c font24B_ASCII.c
font32_ASCII.o:font32_ASCII.c font.h
$(CROSS)gcc -c font32_ASCII.c
font32B_ASCII.o:font32B_ASCII.c font.h
$(CROSS)gcc -c font32B_ASCII.c
hzk12.o:hzk12.c font.h
$(CROSS)gcc -c hzk12.c
hzk16.o:hzk16.c font.h
$(CROSS)gcc -c hzk16.c
hzk24.o:hzk24.c font.h
$(CROSS)gcc -c hzk24.c

.PHONY:clean
clean:
rm -vf *.o *.*~ *~

image文件夹下makefile同font文件夹下是一样的。

问题:
在main文件夹下如果有c文件改变,make可以检测出来,修改后直接make就可以;在子文件夹下修改c文件后,make就不能检测出来,因为main文件夹下只是检测子文件夹里的.o文件是否存在,存在就不会再去make,必须要make clean后才能检测子文件夹的改动。怎样修改能达到任何一个文件修改后,make能选择性编译呢?
初使用makefile,谢谢您的回复。
...全文
评论 4
收藏 已收藏
分享
返回顶部
water-moon
Linux/Unix社区 23,224 成员 74,535 内容