常见的Makefile类型有这样一行:
OBJS=something.o other.o third.o progname.o
progname: $(OBJS)
然后你需要运行make progname
。但GNU Make也可以从当前目录中看到的所有c文件自动生成o文件列表。这是如何实现的?
基本上,我希望能够添加C文件到目录中而不必更改makefile。
(例如,通过一些shell魔法来实现,还是有内置函数可以做到这一点?)
常见的Makefile类型有这样一行:
OBJS=something.o other.o third.o progname.o
progname: $(OBJS)
然后你需要运行make progname
。但GNU Make也可以从当前目录中看到的所有c文件自动生成o文件列表。这是如何实现的?
基本上,我希望能够添加C文件到目录中而不必更改makefile。
(例如,通过一些shell魔法来实现,还是有内置函数可以做到这一点?)
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)
progname: $(OBJS)
如果包含main()
的目标文件名为"progname.o",那么这将完美地工作。
若要查看所有已定义的规则(包括隐式规则),请执行make -p
命令。
然而,make知道如何从源文件生成目标文件,并不意味着它应该这样做。Make会尽可能少地完成您请求构建的目标所需的操作。
如果您希望make将所有源文件编译为当前目录中的对象文件,则需要一个依赖于所有对象的规则,例如:
all: $(patsubst %.c,%.o,$(wildcard *.c))
您可以扩展一个 shell 命令以获取文件列表。您还可以使用 隐式规则。
make
“知道”如何从大量“标准”程序的源代码创建某些二进制文件。您可以利用这些知识,简单地告诉它“这是目标-从适当命名的源代码构建它”。我无法给您示例,因为我已经超过3年没有使用make
,并且已经从我的脑海中淘汰了。 - Noufal Ibrahim可以这样做:
$(ODIR)/%.o: %.cpp
$(CC) -c $(CFLAGS) -o $@ $<
make 会从当前目录中找到的 .cpp 文件名生成 .o 文件名。
$(shell ls)
是一种丑陋的方法,你的解决方案肯定更加简洁。 - Chen Levy