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 只会认为先决条件列表中的 %
是普通字符,例如 a
或 b
或其他任何字符. 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;没用。
我在 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 只会认为先决条件列表中的 %
是普通字符,例如 a
或 b
或其他任何字符. 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;没用。