【发布时间】:2017-02-16 10:22:27
【问题描述】:
我有一个需要使用不同编译器标志多次构建的二进制文件。因此,我有一个 Makefile 声明如下:
OBJECTS_A := $(addprefix $(OBJFOLDER)/, $(SOURCES:.cpp=.a.o))
OBJECTS_B := $(addprefix $(OBJFOLDER)/, $(SOURCES:.cpp=.b.o))
OBJECTS_C := $(addprefix $(OBJFOLDER)/, $(SOURCES:.cpp=.c.o))
我还定义了一个规则来更改每个 OBJECTS_x 的标志:
$(OBJECTS_B): DEFINES+=-D_B
$(OBJECTS_C): DEFINES+=-D_C
这就是问题发生的地方:如果我将目标分别声明为:
$(OBJFOLDER)/%.a.o: %.cpp
$(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o $@
$(OBJFOLDER)/%.b.o: %.cpp
$(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o $@
$(OBJFOLDER)/%.c.o: %.cpp
$(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o $@
所有作品。但是,如果我将所有规则合并为一个,则只评估第一个:
$(OBJFOLDER)/%.a.o $(OBJFOLDER)/%.b.o $(OBJFOLDER)/%.c.o: %.cpp
$(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o $@
我在试运行中得到的是只构建了 $(OBJFOLDER)/%.ao 对象,但根据链接规则,每个二进制文件都需要其对象(因此 b 和 c 二进制文件无法构建)。
有什么想法吗? 谢谢!
【问题讨论】:
-
具有多个目标模式的模式规则意味着与您所经历的完全一样:它需要一次调用配方来构建 ALL 目标。当程序创建多个输出文件时使用它。见gnu.org/software/make/manual/html_node/Pattern-Intro.html(最后一段)