Если вы не против иметь отдельные объектные файлы (например, 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)