GNU make substitute命令用于自动列出目标文件

时间:2011-04-11 06:11:40

标签: makefile

普通类型的makefile有这样一行:

OBJS=something.o other.o third.o progname.o

progname: $(OBJS)

然后你会运行make progname。但GNU Make也可以从它在当前目录中看到的所有c文件生成o文件列表。这是怎么做到的?

基本上,我希望能够将C文件添加到目录中,而无需更改makefile。

(例如通过一些shell-magic,还是有内置函数?)

4 个答案:

答案 0 :(得分:4)

它也可以这样做:

SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)

progname: $(OBJS)

如果其中包含main()的目标文件是“progname.o”,那么该工作正常。

答案 1 :(得分:3)

要查看所有已定义的规则(包括隐式规则),请发出make -p

然而,make知道如何从源文件生成目标文件这一事实并不意味着它应该这样做。 Make会尽量做到最低限度,以满足你要求它建立的目标。

如果您希望make将所有源代码编译到当前目录中的对象中,则需要一个依赖于所有对象的规则,例如:

all: $(patsubst %.c,%.o,$(wildcard *.c))

答案 2 :(得分:1)

您可以展开shell命令以提供文件列表。您也可以使用implicit rules

答案 3 :(得分:0)

可以这样做:

$(ODIR)/%.o: %.cpp
   $(CC) -c $(CFLAGS) -o $@ $<

从当前目录中找到的.cpp文件名生成.o文件名。