2011-08-31 101 views
1

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

+1

你可以这样做,但是你失去了单独编译的好处,除非你经常只重新编译一个目标。也许使用不同的目标文件目录? – delnan

+0

好的,是否有一个简单的规则来指定如何为a.out2(例如)whith postfix编译objs?例如。如: – jonathan

+0

* 2.o:* .c: CC%.c -o%2.o – jonathan

回答

0

这个怎么样?

a.out2: clear1 
    #other commands 

a.out1: clear2 
    #other commands 
+0

Ehm,这是最简单的解决方案。但是如果只有a.out2并且我改变了file.c?然后我必须再次编译整个项目。这不是我正在寻找的解决方案。 – jonathan

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 [email protected] from $< by rule 1 

obj%2.o: %.cc 
    build [email protected] 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 [email protected] 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)