adgentleman 2020-08-26 10:10 采纳率: 50%
浏览 58

嵌套Makefile自动生成依赖问题

我构建了这样一个目录树,顶层Makefile调用world/Makefile和main/Makefile.

我尝试修改world/headers/world.h的内容,在顶层make的时候没有重新编译world.c。
我疑惑的是单个Makefile自动生成依赖项是有效的,但是如果嵌套makefile就无效了。

图片说明

顶层Makefile内容:

export EXE_OUTPUT_DIR = $(shell pwd)/build
export LIB_OUTPUT_DIR = $(EXE_OUTPUT_DIR)/lib

modules = world main
all:
    @for subdir in $(modules);  \
    do                          \
        $(MAKE) -C "$$subdir";  \
    done

clean:
    @for subdir in $(modules);  \
    do $(MAKE) -C "$$subdir" $@; \
    done

.PHONY:clean

world/Makefile:

# VPATH = src
SRC_FILE = $(wildcard src/*.c)
SRC_OBJ = $(SRC_FILE:.c=.o)
TARGET = libworld.a

CFLAGS += -g -Wall -Werror
CPPFLAGS += -I. -I./headers

$(TARGET): $(SRC_OBJ)
    $(AR) rcs $@ $^
    cp $@ $(LIB_OUTPUT_DIR)

%.d:%.c
    @$(CC) -MM $(CPPFLAGS) $< > $@.$$$$; \
    sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
    rm -f $@.$$$$

-include $(SRC_OBJ:.o=.d)

clean:
    $(RM) $(SRC_OBJ) $(TARGET) $(LIB_OUTPUT_DIR)/$(TARGET)
    $(RM) $(SRC_OBJ:.o=.d)

main/Makefile:

SRC_FILE = $(wildcard *.c)
SRC_OBJ = $(SRC_FILE:.c=.o)

TARGET=target

CFLAGS += -g -Wall -Werror
CPPFLAGS += -I. -I../world/headers
LDFLAGS += -lpthread -L$(LIB_OUTPUT_DIR) -lworld

$(TARGET): $(SRC_OBJ)
    $(CC) -o $@ $^ $(LDFLAGS)
    cp $@ $(EXE_OUTPUT_DIR)

clean:
    $(RM) $(SRC_OBJ) $(TARGET) $(EXE_OUTPUT_DIR)/$(TARGET)
  • 写回答

1条回答 默认 最新

  • dabocaiqq 2020-08-26 11:09
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)