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