我正在尝试使用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
哪个不对
有没有一种简单的方法来实现我之前写的结果?
答案 0 :(得分:1)
Make已经有将.cpp
文件转换为.o
文件的内置规则。只需写下:
SOURCES = a.cpp b.cpp c.cpp
all: $(SOURCES:.cpp=.o)
它会起作用。如果您想知道如何编写自己的规则,请阅读implicit rules,特别是pattern rules。