make: *** 没有规则来创建 'Program.exe' 需要的目标 '%.o'。停止

make: *** No rule to make target '%.o', needed by 'Program.exe'. Stop

我在 src 文件夹中有我的源文件,当我 运行 make (windows) 我得到以下错误 make: *** 没有规则来创建 'Program.exe' 需要的目标 '%.o'。停止。

VPATH := src

Program.exe : %.o
    g++.exe -o bin/program.exe  $<


%.o : %.cpp
    echo $<
    g++ -c -ILibraries/include -LLibraries/lib $< -lgdi32

make中的%不是匹配文件的通配符。同样,因为当 make 启动时,不会有任何 .o 文件匹配。

make 中的 % 是一个模式匹配,它只适用于模式规则:模式规则必须在 target 中有一个 % (比如您拥有的第二条规则,%.o : %.c)。如果目标中没有 %,那么 make 只会认为先决条件列表中的 % 是普通字符,例如 ab 或其他任何字符. Make 不知道如何创建一个名为 %.o 的文件,因为没有匹配的 %.cpp 文件。

另外make创建一个不等于$@的文件总是错误的。这里你的目标是 Program.exe 但你的食谱创建了一个文件 bin/program.exe:它们不是一回事所以它是错误的。

此外,$< 只是第一个先决条件:当您想要 link 大量文件在一起时,您需要使用 $^,这是所有先决条件。

您需要列出所有要创建的目标文件:

bin/program.exe: src/foo.o src/bar.o src/baz.o
        g++.exe -o $@ $^

如果你想自动生成所有的目标文件,假设你想编译所有的源文件,你可以这样做:

OBJS := $(patsubst %.cpp,%.o,$(wildcard src/*.cpp))

bin/program.exe: $(OBJS)
        g++.exe -o $@ $^

这种情况不需要设置VPATH;没用。