爲什麼不鏈接到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
爲什麼不鏈接到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
模式規則必須有一個與它們相關的配方。任何沒有配方的模式規則都會告訴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的內置規則處理。
Make有一個預定義的規則來從'foo.c'製作'foo.o'。奇怪的是,如果我將規則更改爲'foo_test:foo_test.o foo.o',那麼'cc'將與'foo.o'鏈接。 –
我不明白爲什麼會發生這種情況,但我注意到如果您將模式規則從沒有命令的規則更改爲具有空命令('%_test:%_test.o foo.o;')的規則,則該規則按預期工作。 – Beta
@貝塔:那對我不起作用。使用空命令,foo_test.c和foo.c都會被編譯,但不會發生鏈接。我運行GNU Make 3.81。你使用什麼版本的Make? –