GNU Make替换命令自动生成对象文件列表

3

常见的Makefile类型有这样一行:

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

progname: $(OBJS)

然后你需要运行make progname。但GNU Make也可以从当前目录中看到的所有c文件自动生成o文件列表。这是如何实现的?

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

(例如,通过一些shell魔法来实现,还是有内置函数可以做到这一点?)

4个回答

5
这也可以这样做:
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)

progname: $(OBJS)

如果包含main()的目标文件名为"progname.o",那么这将完美地工作。


3

若要查看所有已定义的规则(包括隐式规则),请执行make -p命令。

然而,make知道如何从源文件生成目标文件,并不意味着它应该这样做。Make会尽可能少地完成您请求构建的目标所需的操作。

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

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

1
我冒昧改了"shell ls .c"为"通配符.c",因为那更具可移植性。 - Prof. Falken
谢谢,@Amigable Clark Kant,确实$(shell ls)是一种丑陋的方法,你的解决方案肯定更加简洁。 - Chen Levy

1

您可以扩展一个 shell 命令以获取文件列表。您还可以使用 隐式规则


你需要查看该页面上的文档。基本思想是make“知道”如何从大量“标准”程序的源代码创建某些二进制文件。您可以利用这些知识,简单地告诉它“这是目标-从适当命名的源代码构建它”。我无法给您示例,因为我已经超过3年没有使用make,并且已经从我的脑海中淘汰了。 - Noufal Ibrahim

0

可以这样做:

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

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


@Amigable Clark Kant:不,你需要自己定义它。 - weekens
似乎没有那个规则程序也可以完美运行,所以我猜测可能已经有了一个隐含的规则。 - Prof. Falken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接