2012-05-22 48 views
0

爲什麼不鏈接到foo.o爲什麼Make忽略我的通配符規則?

$ ls 
foo.c foo_test.c Makefile 

$ cat Makefile 
.PHONY: test 
test: foo_test 
%_test: %_test.o foo.o 

$ make 
cc  foo_test.c -o foo_test 
+0

Make有一個預定義的規則來從'foo.c'製作'foo.o'。奇怪的是,如果我將規則更改爲'foo_test:foo_test.o foo.o',那麼'cc'將與'foo.o'鏈接。 –

+0

我不明白爲什麼會發生這種情況,但我注意到如果您將模式規則從沒有命令的規則更改爲具有空命令('%_test:%_test.o foo.o;')的規則,則該規則按預期工作。 – Beta

+0

@貝塔:那對我不起作用。使用空命令,foo_test.c和foo.c都會被編譯,但不會發生鏈接。我運行GNU Make 3.81。你使用什麼版本的Make? –

回答

3

模式規則必須有一個與它們相關的配方。任何沒有配方的模式規則都會告訴GNU make刪除該模式規則。所以,你行:

%_test: %_test.o foo.o 

什麼都不做,除了刪除不存在的模式規則從%_test.o建立%_test。你需要創建一個配方,如果你想它生效:

%_test: %_test.o foo.o 
     $(CC) -o [email protected] $(LIBS) $^ 

或其他。但是,對於您的示例,這完全不是必需的。你不需要任何規則可言對於這一點,只寫:

foo_test: foo_test.o foo.o 

,讓make的內置規則處理。

+0

好的,謝謝你的解釋。我的例子是一個更大更復雜的makefile的簡化,所以我不能像你所建議的那樣簡化它。 –

+0

+1擊敗我。 – Beta

+0

PS:我不同意「......告訴GNU Make刪除該模式規則」,但這是一個微妙的觀點,不會改變最終答案。 – Beta