В чем разница между $ (objs):% .o:% .cpp и $ (objs): $ (objs: .o = .cpp) в Makefile - PullRequest
0 голосов
/ 05 мая 2019

У меня есть add.c sub.c в текущем каталоге и скомпилирую их через makefile.

Я делаю следующее:

программа 1:

objs = $ (patsubst% .cpp,% .o, $ (подстановочный знак * .cpp))

$ (objs):% .o:% .cpp

g ++ -o $ @ -c $ <</p>

программа 2:

objs = $ (patsubst% .cpp,% .o, $ (подстановочный знак * .cpp))

$ (objs): $ (objs: .o = .cpp)

g ++ -o $ @ -c $ <</p>

Программа 1 успешно компилируется. Но программа 2 получает следующую команду:

g ++ -o sub.o -c sub.cpp

g ++ -o add.o -c sub.cpp

Так в чем разница между этими двумя программами?

1 Ответ

1 голос
/ 05 мая 2019

Правило в 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.

...