假设我正在制作一个makefile,并且在顶部有以下变量声明:
FILES = file1.cpp file2.cpp file3.cpp
现在假设我想用一个特殊的命令来编译每个对象,而不用像这样指定每个目标:
file1.o : file1.cpp
custom_command file1.cpp
file2.o : file2.cpp
custom_command file2.cpp
file3.o : file3.cpp
custom_command file3.cpp
使用上面声明的
$(FILES)
变量是否有更好的方法?就像是:
$(FILES:.cpp=.o) : $(FILES)
custom_command $(FILES)
...只需要对
$(FILES)
变量中的每个文件执行此操作。
最佳答案
是。有所谓的模式规则。一个例子最容易理解:
%.o: %.cpp
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
(请记住,Makefile文件需要使用制表符)。该规则描述了如何从cpp文件制作目标文件。
如果您不希望使用如此宽泛的规则,则可以使用所谓的静态模式:
objects = file1.o file2.o file3.o
all: $(objects)
$(objects): %.o: %.cpp
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
这是GNU Make手册中有关static pattern rules和pattern rules的部分。
关于arrays - 如何在Makefile中将变量列表用作目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4320416/