Правило в make-файле 1 эквивалентно
sub.o: sub.cpp
g++ -o $@ -c $<
add.o: add.cpp
g++ -o $@ -c $<
, которое работает правильно.
Правило в make-файле 2 расширяется до
sub.o add.o: sub.cpp add.cpp
g++ -o $@ -c $<
, которое говорит, что каждая из этих двух целей зависит от обоих исходных файлов.Обратите внимание, что автоматическая переменная $<
расширяется до первой предпосылки, которая в данном случае равна sub.cpp
.Так что это единственный исходный файл, который использует правило, даже при попытке собрать add.o
.