Makefile-两个不同的目标
我正在为一个应用程序创建一个Makefile,它可以用两种不同的方式构建。一个(我们可以称之为基本输出),有一个称为a.out1的输出。第二个输出是通过显式地将参数传递给make-例如“make a.out2”,并启用一些特性,这些特性由源中的预处理器打开。 因此,对象文件不同于.out1中的对象文件。在生成.out2时,是否有一个选项可以在Makefile中指定,以明确表示如果a.out1已经生成,则使用对象文件清除它并生成a.out1(和依赖的objs)?(当然,反之亦然) 谢谢这个怎么样Makefile-两个不同的目标,makefile,Makefile,我正在为一个应用程序创建一个Makefile,它可以用两种不同的方式构建。一个(我们可以称之为基本输出),有一个称为a.out1的输出。第二个输出是通过显式地将参数传递给make-例如“make a.out2”,并启用一些特性,这些特性由源中的预处理器打开。 因此,对象文件不同于.out1中的对象文件。在生成.out2时,是否有一个选项可以在Makefile中指定,以明确表示如果a.out1已经生成,则使用对象文件清除它并生成a.out1(和依赖的objs)?(当然,反之亦然) 谢谢这个怎么样
a.out2: clear1
#other commands
a.out1: clear2
#other commands
这个怎么样
a.out2: clear1
#other commands
a.out1: clear2
#other commands
如果您不介意使用单独的对象文件(例如
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
如果两个构建命令(用于以两种不同的方式构建对象)之间的区别很简单,例如更改编译器参数,则可以使最后两个规则稍微简单一些:
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)
如果您不介意使用单独的对象文件(例如
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
如果两个构建命令(用于以两种不同的方式构建对象)之间的区别很简单,例如更改编译器参数,则可以使最后两个规则稍微简单一些:
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)
您可以这样做,但是如果不经常只重新编译一个目标,您将失去单独编译的好处。也许两者都使用不同的对象文件目录?好的,有没有一个简单的规则来指定如何为带有后缀的.out2(例如)编译objs?例如:你可以这样做,但是你失去了单独编译的好处,除非你经常只重新编译一个目标。也许两者都使用不同的对象文件目录?好的,有没有一个简单的规则来指定如何为带有后缀的.out2(例如)编译objs?嗯,这是最简单的解决办法。但是,如果只有一个.out2,而我更改了文件.c怎么办?然后我必须重新编译整个项目。这不是我想要的解决方案。嗯,这是最简单的解决方案。但是,如果只有一个.out2,而我更改了文件.c怎么办?然后我必须重新编译整个项目。这不是我想要的解决方案。