Makefile语法不清楚

Makefile语法不清楚,makefile,Makefile,这是我的第一个Makefile,我不知道使用了哪些语法。问题标记在下面 $(BUILD_DIR)/%.o: %.c $(BUILD_DIR) $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@ $(构建目录)/%.o:%.c$(构建目录) $(CC)-c$(CFLAGS)-Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir$)(与大多数计算机

这是我的第一个Makefile,我不知道使用了哪些语法。问题标记在下面

$(BUILD_DIR)/%.o: %.c  $(BUILD_DIR) 
  $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@
$(构建目录)/%.o:%.c$(构建目录)

$(CC)-c$(CFLAGS)-Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir$)(与大多数计算机语言一样,如果您不知道make的语法,则无法清楚。如果您使用GNU,make是您的朋友。在下面的解释中,我将假设
BUILD_DIR=BUILD
,并且其中一个源文件是
bar/foo.c

  • 先决条件(依赖项)列表中的
    $(BUILD\u DIR)
    告诉make在执行配方之前必须存在生成目录(对象文件应该位于其中);这是合乎逻辑的。如果目录还不存在,则必须有另一条规则来创建该目录。类似于:

    $(BUILD_DIR):
        mkdir -p $@
    
    但是,除非您忘记复制一个重要字符,否则这种依赖关系是非常次优的。因为每次目录内容更改(添加或删除文件或子目录)时,目录的上次修改时间都会更改,它将在每次目录更改时强制重新编译所有源文件,这不是您想要的。更好的依赖关系是:

    这只考虑了“代码> > $(BuudIddir)< /C>,而不是它的最后修改时间,当决定重新构建或不使用时。

  • $(构建目录)/$(非目录$(
    
    $(BUILD_DIR)/%.o: %.c | $(BUILD_DIR)
    
        build/bar/foo.o: bar/foo.c | build
            $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=build/foo.lst bar/foo.c -o build/bar/foo.o
    
    $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(<:.c=.lst) $< -o $@
    
    $(BUILD_DIR)/%.o: %.c
        mkdir -p $(dir $@)
        $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@