Makefile - 两个不同的目标

时间:2011-08-31 14:37:35

标签: makefile

我正在为一个应用程序制作一个Makefile,它可以用两种不同的方式构建。一个(我们可以称之为基本输出),有一个名为a.out1的输出。第二个输出是通过显式地将参数传递给make - 例如`make a.out2'并启用一些功能,这些功能由源中的预处理器打开。 因此,目标文件与a.out1中的目标文件不同。在构建a.out2时是否有在Makefile中指定的选项,明确地说如果a.out1已经构建,则用目标文件清除它并构建a.out1(和依赖的objs)? (当然反之亦然) 感谢

2 个答案:

答案 0 :(得分:1)

如果你不介意有单独的目标文件(例如objA1.oobjA2.o),那么这是一种方法:

OBJECTS = objA objB objC

OBJ1 = $(addsuffix 1.o,$(OBJECTS))
OBJ2 = $(addsuffix 2.o,$(OBJECTS))

a.out1: $(OBJ1)
    link $^ together one way

a.out2: $(OBJ2)
    link $^ together another way

obj%1.o: %.cc
    build $@ from $< by rule 1

obj%2.o: %.cc
    build $@ from $< by rule 2

如果两个可执行文件(a.outa.out2)需要不同的目标文件,则可以执行以下操作:

COMMON_OBJECTS = objA objB objC

OBJ1 := $(addsuffix 1.o,$(COMMON_OBJECTS))
OBJ2 := $(addsuffix 2.o,$(COMMON_OBJECTS))

OBJ1 += objD
OBJ2 += objE objF

如果两个构建命令(用于以两种不同的方式构建对象)之间的区别很简单,比如更改编译器参数,则可以使最后两个规则更简单:

obj%1.o: CC_FLAGS += $(FLAGS_FOR_ONE)
obj%2.o: CC_FLAGS += $(FLAGS_FOR_TWO)

obj%1.o obj%2.o: %.cc
    build $@ from $< using $(CC_FLAGS)

同样,除了链接器参数(或完全相同)之外,链接命令是相同的:

a.out1: $(OBJ1)
a.out1: LINKER_FLAGS += $(L_FLAGS_FOR_ONE)

a.out2: $(OBJ2)
a.out1: LINKER_FLAGS += $(L_FLAGS_FOR_TWO)

a.out1 a.out2: $(OBJ1)
    link $^ together using $(LINKER_FLAGS)

答案 1 :(得分:0)

这个怎么样?

a.out2: clear1
    #other commands

a.out1: clear2 
    #other commands