普通类型的makefile有这样一行:
OBJS=something.o other.o third.o progname.o
progname: $(OBJS)
然后你会运行make progname
。但GNU Make也可以从它在当前目录中看到的所有c文件生成o文件列表。这是怎么做到的?
基本上,我希望能够将C文件添加到目录中,而无需更改makefile。
(例如通过一些shell-magic,还是有内置函数?)
答案 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文件名。