我不知道你想什麼,但我敢肯定,這條規則:
$(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