【问题标题】:Makefile multiple targets from same source file, with different flagsMakefile 来自同一源文件的多个目标,具有不同的标志
【发布时间】: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 二进制文件无法构建)。

有什么想法吗? 谢谢!

【问题讨论】:

标签: makefile build targets


【解决方案1】:

您可以使用secondary expansion 实现此目的:

.SECONDEXPANSION:
$(OBJFOLDER)/%.o: $$(basename $$*).cpp
        $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c $< -o $@

请注意,这不是一种非常惯用的方式,更常见的 define / call / eval 组合可用于生成规则,就像您的第一个解决方案一样:

VARIANTS=a b c

DEFINES_FOR_a=
DEFINES_FOR_b=-D_B
DEFINES_FOR_c=-D_C

define make_target =
$$(OBJFOLDER)/%.$(1).o: %.cpp
        $$(COMPILER) $$(CFLAGS) $$(INCFOLDER) $$(DEFINES_FOR_$(1)) -c $$< -o $$@

endef

$(eval $(foreach variant,$(VARIANTS),$(call make_target,$(variant))))

【讨论】:

  • 为什么目标特定的变量分配不再起作用?
  • 我的错,效果很好,我编辑了答案
【解决方案2】:

另一种方法是创建指向源文件的符号链接并编译具有不同标志的文件。这样,同一个通用模式规则 (OBJFOLDER)/%.o: %.cpp 就可以构建您的所有目标:

OBJECTS_A := $(SOURCES:%.cpp=$(OBJFOLDER)/%.a.o)
OBJECTS_B := $(SOURCES:%.cpp=$(OBJFOLDER)/%.b.o)
OBJECTS_B := $(SOURCES:%.cpp=$(OBJFOLDER)/%.c.o)
$(OBJECTS_B): DEFINES+=-D_B
$(OBJECTS_C): DEFINES+=-D_C

%.a.cpp : %.cpp
    ln -s $< $@

%.b.cpp : %.cpp
    ln -s $< $@

%.c.cpp : %.cpp
    ln -s $< $@

$(OBJFOLDER)/%.o: %.cpp
    $(COMPILER) $(CFLAGS) $(INCFOLDER) $(DEFINES) -c -o $@ $< 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多