我不知道你想什么,但我敢肯定,这条规则:
$(EXEC): %.o
$(CC) -o $(EXEC) $<
没有做到这一点。在这条规则中,'%'不是任何一种通配符,它只是一个字符。所以当Make尝试构建a.out
时,它会寻找一个名为%.o
的文件,找不到它,没有建立它的规则(因为没有%.c
而且没有办法构建那),并放弃。
你的意图不清楚。如果您希望规则能够建立从a.o
a.out
(从foo.o
同样foo.out
,并从bar.o
bar.out
,等等),写一个pattern rule:
%.out: %.o
$(CC) -o [email protected] $<
$(EXEC): # Make will not use a pattern rule as the default, so we need this
(注意用[email protected]。)或(将其限制到可执行文件中EXEC
列表)一个static pattern rule:
$(EXEC): %.out : %.o
$(CC) -o [email protected] $<
如果,另一方面,你要请使用所有的源文件它可以找到建立这个可执行文件,你必须做这样的事情:
SOURCES = $(wildcard *.c) # make a list a.c foo.c bar.c
OBJECTS = $(patsubst %.c, %.o, $(SOURCES)) # translate it into a.o foo.o bar.o
$(EXEC): $(OBJECTS)
$(CC) -o $^ $<
注意使用the wildcard function和$^其扩展为先决条件的列表,同时还指出,“*的.o”不会你有多好。
'%'匹配*目标*名称的任何部分 - 因此它将匹配'a.out'的任何部分。除非你的源文件被称为'a.out.c',否则它不会匹配任何东西。您可能想尝试使用'* .o'(当然,风险自负)。 – isedev 2014-08-30 21:08:14
'$ <'仅对应于第一个依赖项。因此,如果您有多个源文件(并因此有多个目标文件),则只有第一个将被编译并链接到可执行文件中。如果使用GNU make,则可以使用'$ *'代替。 – isedev 2014-08-30 21:13:09
你想让它用来构建'a.out'的对象文件是什么?如果有两个源文件,'a.c'和'b.c',它们应该同时使用,还是只使用'a.o'? – Beta 2014-08-30 23:09:44