如何在Makefile中使用变量列表作为目标?

Nat*_*man 24 arrays variables makefile target

假设我正在处理一个makefile,我在顶部有以下变量声明:

FILES = file1.cpp file2.cpp file3.cpp
Run Code Online (Sandbox Code Playgroud)

现在假设我想用特殊命令编译每一个而不指定每个目标,如下所示:

file1.o : file1.cpp
    custom_command file1.cpp
file2.o : file2.cpp
    custom_command file2.cpp
file3.o : file3.cpp
    custom_command file3.cpp
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来使用$(FILES)我上面声明的变量?

就像是:

$(FILES:.cpp=.o) : $(FILES)
    custom_command $(FILES)
Run Code Online (Sandbox Code Playgroud)

...只需要为$(FILES)变量中的每个文件执行此操作.

Chr*_*ris 41

是.有所谓的模式规则.一个例子是最容易理解的:

%.o: %.cpp
       $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
Run Code Online (Sandbox Code Playgroud)

(记住Makefile 需要标签).此规则描述如何从cpp文件创建目标文件.

如果您不想要这么宽泛的规则,可以使用所谓的静态模式:

objects = file1.o file2.o file3.o

all: $(objects)

$(objects): %.o: %.cpp
        $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
Run Code Online (Sandbox Code Playgroud)

这是GNU Make手册中有关静态模式规则模式规则的部分.


pax*_*blo 8

可以按照以下方式执行此操作:

SRCS=a.c b.c
OBJS=$(SRCS:.c=.o)

$(OBJS): $(SRCS)
        cc -c -o a.o a.c
        cc -c -o b.o b.c
Run Code Online (Sandbox Code Playgroud)

但你要记住的是,依赖关系是完整的-它假定a.o取决于b.c以及这可能并非如此.

你可能会追求的是关于如何将一种文件类型转换为另一种文件类型的单一规则:

SRCS=a.c b.c
OBJS=$(SRCS:.c=.o)

all: $(OBJS)

.c.o:
        gcc -c -o $@ $<
Run Code Online (Sandbox Code Playgroud)

.c.o是一个规则,它规定了将.c文件转换为.o文件的命令.在实际的命令,$@置换为特定的目标和$<被替换为第一要义的名称.

如果你没有可用的东西,你可以使用许多其他自动变量,查找info make或查找好书.makeinfo