从源文件列表生成 makefile 目标

Generate makefile targets from a list of source files

我正在尝试使用 make 创建构建系统并希望执行以下操作:

有一个在 makefile 中指定的源文件列表,例如

SOURCES = a.cpp b.cpp c.cpp

自动创建分别依赖于每个文件的构建目标

即自动扩展为的单个规则:

a.o: a.cpp
   $(CC) $(CFLAGS) -c a.cpp -o a.o

b.o: b.cpp
   $(CC) $(CFLAGS) -c b.cpp -o b.o

c.o: c.cpp
   $(CC) $(CFLAGS) -c c.cpp -o c.o

我试过以下方法:

SOURCES = a.cpp b.cpp c.cpp
OBJECTS = $(SOURCES:.cpp=.o)

$(OBJECTS): $(SOURCES)
   $(CC) $(CFLAGS) -c $< -o $@

然而,这似乎扩展为以下内容

a.o: a.cpp b.cpp c.cpp
   $(CC) $(CFLAGS) -c a.cpp -o a.o

b.o: b.cpp b.cpp c.cpp
   $(CC) $(CFLAGS) -c a.cpp -o b.o

c.o: c.cpp b.cpp c.cpp
   $(CC) $(CFLAGS) -c a.cpp -o c.o

哪个不对

有没有简单的方法可以达到我之前写的结果?

Make 已经内置了将 .cpp 文件转换为 .o 文件的规则。随便写:

SOURCES = a.cpp b.cpp c.cpp

all: $(SOURCES:.cpp=.o)

它会起作用的。如果您想知道如何编写自己的规则,请阅读 implicit rules, in particular pattern rules