我的項目包含.c和.s(asm)文件。我用'gcc'編譯這兩種類型,並將輸出.o文件放在單獨的目錄'./bin'中。要做到這一點我使用單生成文件的規則是這樣使用通配符搜索先決條件時,Makefile的'vpath'不起作用
bin/%.o: %.[cs]
$(CC) $(CFLAGS) -o [email protected] -c $<
(據我瞭解,在這樣的環境中使用方括號通配符是有點不合常規,但它的工作,它看起來整潔,所以.. 。)
有一天,我決定把我的一些.c文件移動到專用目錄「./common」,所以我在生成文件的開頭添加
vpath %.c common
。現在,每當我嘗試「製作」時,它就會停止並在我移動的文件上拋出錯誤。例如,對於'common/foo.c'我得到
"*** No rule to make target bin/foo.o, needed by..."
好像我還沒有指定'vpath'。但是,當我修改的規則只編譯.c文件
bin/%.o: %.c
... ...
神奇它再次開始正常運行,並檢查「./common」的來源。
看起來像'vpath'機制和通配符不能一起工作,但我仍然是'make'的新手,並且渴望知道這種行爲的確切原因。任何想法的人?提前致謝。
(測試用make-3.81,使-4.1)。
UPD:把所有的文件和 'bin' 目錄駐留在同一水平上,像這樣
|-bin/
|-foo.c
|-bar.s
|-baz.c
|-Makefile
這裏的MWE
ROOTS = foo.o bar.o
OBJS = baz.o
SS = $(addprefix bin/,$(ROOTS) $(OBJS))
all: ff.out
ff.out: $(SS)
ld -o [email protected] $^
bin/%.o: %.[cs]
gcc -o [email protected] -c $<
現在,如果我動,說「foo.c的」以獨立的目錄,並指定「VPATH」,停止建設「無規則,使目標bin/foo.o,由ff.out需要「。
發佈原始生成文件的[mcve],爲方括號指定沒有特殊含義,因此它必須使用其內置規則,但是某些內容並不會增加您對行爲的描述。 – user657267
@ user657267那麼,'make'spec/4.3會告訴別人:方括號會以類似bash的方式作爲通配符處理。我已經將MWE添加到了我的問題中。 –
對不起,你是對的,我不敢相信我不知道。 – user657267