Makefile:无规则生成目标(自动变量)

Makefile:无规则生成目标(自动变量),makefile,Makefile,我的makefile有问题,我一直在阅读somme教程,了解如何制作一个更可重用的makefile,但我面临这个错误,我已经搜索了一段时间,尤其是GNU make手册和这里 这是我的makefile: SRC_DIR=./src BUILD_DIR=./build OBJS= $(BUILD_DIR)/main.o $(BUILD_DIR)/hamming.o $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c $(SRC_DIR)/%.h $(CC) -c $<

我的makefile有问题,我一直在阅读somme教程,了解如何制作一个更可重用的makefile,但我面临这个错误,我已经搜索了一段时间,尤其是GNU make手册和这里

这是我的makefile:

SRC_DIR=./src
BUILD_DIR=./build
OBJS= $(BUILD_DIR)/main.o $(BUILD_DIR)/hamming.o

$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c $(SRC_DIR)/%.h
    $(CC) -c $< $(CFLAGS) -o $@

$(BUILD_DIR)/main: $(OBJS)
    $(CC) -o $@ $^ $(CFLAGS)
SRC\u DIR=。/SRC
构建目录=/构建
OBJS=$(BUILD\u DIR)/main.o$(BUILD\u DIR)/hamming.o
$(构建目录)/%.o:$(SRC目录)/%.c$(SRC目录)/%.h
$(CC)-c$<$(CFLAGS)-o$@
$(构建目录)/main:$(OBJS)
$(CC)-o$@$^$(CFLAGS)
我有一个错误:

make:没有规则生成目标
build/main.o',这是
build/main'需要的。停止。

在我看来,变量OBJS中的对象似乎与%.o模式规则没有关联,但我不知道为什么

在我的工作目录中有:我的makefile和两个目录'src'和'build'


谢谢。

这是我之前整理的一些文档,希望能有所帮助。您确定命令前只有选项卡吗。你不可能有空格,这是我在过去看到的第一个错误。

我会冒险去猜测没有
src/main.h
。如果是这样,您可以通过以下方式解决问题:

$(BUILD_DIR)/hamming.o: $(BUILD_DIR)/%.o : $(SRC_DIR)/%.h

$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
    $(CC) -c $< $(CFLAGS) -o $@
$(BUILD\u DIR)/hamming.o:$(BUILD\u DIR)/%.o:$(SRC\u DIR)/%.h
$(构建目录)/%.o:$(SRC目录)/%.c
$(CC)-c$<$(CFLAGS)-o$@
编辑:
现在我很困惑。请试试这个(它是粗糙的,但如果它起作用,我们可以精炼它):

SRC\u DIR=。/SRC
构建目录=/构建
OBJS=$(BUILD\u DIR)/main.o$(BUILD\u DIR)/hamming.o
$(构建目录)/%.o:$(SRC目录)/%.c$(SRC目录)/%.h
$(CC)-c$<$(CFLAGS)-o$@
$(BUILD\u DIR)/main.o:$(SRC\u DIR)/main.c
$(CC)-c$<$(CFLAGS)-o$@
$(构建目录)/main:$(OBJS)
$(CC)-o$@$^$(CFLAGS)

谢谢您的回答。我刚检查过,每个命令前只有一个选项卡。没有,没有main.h。事实上,这个错误表明“main.o”没有规则,所以我试着把$(BUILD\u DIR)/main.o:$(BUILD\u DIR)/%.o放进去,但没有成功。无论如何,谢谢。当然,
$(BUILD\u DIR)/main.o:$(BUILD\u DIR)/%。o
不会起作用。尝试我发布的内容。错误消息可能会让您感到困惑:隐式规则可能已匹配并随后被拒绝(在中的步骤5);您应该能够通过查看
make-d
的输出来确定这一点。我是通过“make-d”得到的:我真的不知道如何分析它!现在它工作得很好。然后我尝试执行OBJS=$(BUILD\u DIR)/hamming.o$(BUILD\u DIR)/main.o,这样首先完成文件hamming.o,编译hamming.o文件,但随后我得到与main.o文件相同的错误消息。我猜这是因为确实没有main.h,依赖关系没有得到满足($(BUILD\u DIR)/%.o:$(SRC\u DIR)/%.c$(SRC\u DIR)/%.h),所以main.o没有生成。所以我创建了一个main.h文件,现在我原来的makefile工作得很好@Beta:我想你说得很对,你指出没有src/main.h文件,谢谢!
SRC_DIR=./src
BUILD_DIR=./build
OBJS= $(BUILD_DIR)/main.o $(BUILD_DIR)/hamming.o

$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c $(SRC_DIR)/%.h
    $(CC) -c $< $(CFLAGS) -o $@

$(BUILD_DIR)/main.o: $(SRC_DIR)/main.c
    $(CC) -c $< $(CFLAGS) -o $@

$(BUILD_DIR)/main: $(OBJS)
    $(CC) -o $@ $^ $(CFLAGS)