当源具有不同的扩展名时,使用GNU生成目标文件

时间:2018-03-09 08:25:03

标签: makefile gnu-make

假设我有三个源文件:file3.cfile2.cfile3.s,它们都不具有相同的扩展名。我想将其编译成目标文件:file1.ofile2.ofile3.o,它们具有相同的模式。

OBJ = file1.o file2.o file3.o
all: $(OBJ)
#Here I am in the stuck
$(OBJ) : %.o : %.c #or %.s
    $(CC) $(CFLAGS) -c $< -o $@

如何在GNU make中使用模式规则来做到这一点?

1 个答案:

答案 0 :(得分:1)

用于生成.o文件的配方可以通过以下方式用于.c.s文件:

OBJ = file1.o file2.o file3.o
.PHONY: all
all: $(OBJ)

.SECONDEXPANSION:
%.o: $$(wildcard $$*.c) $$(wildcard $$*.s)
    $(CC) $(CFLAGS) -c $< -o $@

先决条件,可能以.c.s结尾,由secondary expanding stem确定(即$* })和wildcard内置函数,用于将词干连接到相应的&#34;扩展名&#34; .c.s

&#34;或&#34;是通过利用wildcard内置函数扩展为 nothing 这一事实来实现的(而不是像Bash shell那样扩展到提供的模式)不匹配(即:如果没有与提供给wildcard的模式匹配的文件名。)