Makefile语法不清楚
这是我的第一个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$)(与大多数计算机
$(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 $@