Во-первых, этот метод компиляции нескольких исходных файлов непосредственно в исполняемый файл не очень хорошая идея.Более распространенный подход compile-then-link избавит от ненужной компиляции.
Тем не менее, способ замены многих явных правил более простым правилом зависит от того, что общего у явных правил.У вас уже есть шаблонное правило:
%.out: %.cxx
$(CXX) $(CXXFLAGS) $^ -o $@
, и если все, что вы хотите сделать, это добавить другой исходный файл к определенной цели, вам не нужно делать это:
g++ file_main.cxx file.cxx -o file_main.out
Вы можете получить эффект, просто добавив необходимое условие (отдельной строкой):
file_main.out: file.cxx
Если у вас есть несколько целей с этим шаблоном, вы можете использовать правило шаблона:
file_main.out another_main.out a_third_main.out: %_main.out : %.cxx
Если у вас много таких целей, вы можете использовать переменную:
MAIN_THINGS = file another a_third a_fourth and_yet_another
MAIN_TARGETS = $(addsuffix _main.out, $(MAIN_THINGS))
$(MAIN_TARGETS): %_main.out : %.cxx
И вы можете добавить другие шаблоны для других наборов целей, даже перекрывающихся наборов.Это охватывает вашу ситуацию?