Makefile 来自同一源文件的多个目标,具有不同的标志

标签 makefile build targets

我有一个二进制文件,我需要使用不同的编译器标志多次构建它。因此,我有一个 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)/%.a.o 对象被构建,但是根据链接规则,每个二进制文件都需要它的对象(因此 b 和 c 二进制文件无法构建)。

有什么想法吗? 谢谢!

最佳答案

您可以使用 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))))

关于Makefile 来自同一源文件的多个目标,具有不同的标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42271096/

相关文章:

linux - 永久设置 make 使用的线程数

makefile - 如何获取 makefile 中的目标列表?

iPhone - 品牌和多个目标?

xcode - iOS- Storyboard -在 Storyboard 的配置面板中以编程方式使用定义的颜色

c - 基础教程? Eclipse CDT 中的 Makefile

linux - .c.s : in linux-0. 11 生成文件

linux - 配置:DX_INIT_DOXYGEN 检查状态

ios - Xamarin - iPhone 分发

java - 使用 Eclipse 的 Maven/Gradle 工作覆盖示例

未找到 android tensorflow ExtractImagePatches Op