Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile-两个不同的目标_Makefile - Fatal编程技术网

Makefile-两个不同的目标

Makefile-两个不同的目标,makefile,Makefile,我正在为一个应用程序创建一个Makefile,它可以用两种不同的方式构建。一个(我们可以称之为基本输出),有一个称为a.out1的输出。第二个输出是通过显式地将参数传递给make-例如“make a.out2”,并启用一些特性,这些特性由源中的预处理器打开。 因此,对象文件不同于.out1中的对象文件。在生成.out2时,是否有一个选项可以在Makefile中指定,以明确表示如果a.out1已经生成,则使用对象文件清除它并生成a.out1(和依赖的objs)?(当然,反之亦然) 谢谢这个怎么样

我正在为一个应用程序创建一个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怎么办?然后我必须重新编译整个项目。这不是我想要的解决方案。