Вы не можете использовать VPATH для поиска производных (сгенерированных) файлов. VPATH может только использоваться с исходными файлами. Таким образом, эти две линии и вся связанная с ними инфраструктура не будут работать так, как вы ожидаете:
vpath %.so lib
vpath %.a lib
Если вы хотите понять это более полно, вы можете прочитать http://make.mad -scientist.net / paper / how-not-to-use-vpath /
Во-вторых, такие правила:
%.a: pj.o pp.o
ar rs $@ $^
mv *.a ./lib
нарушает второе правило make-файлов . Если вы хотите, чтобы цель была создана в подкаталоге, тогда имя цели должно быть полным именем в подкаталоге. И нет смысла использовать правила шаблона, если вы собираетесь явно перечислить предпосылки в шаблоне. Вы можете использовать что-то вроде:
lib/libjp.a: pj.o pp.o
ar rs $@ $^
lib/libgr.so: pg.o pr.o
gcc -w -shared -o $@ $^
, что означает, что вы должны изменить ссылки на него:
program: program.o lib/libjp.a lib/libgr.so
и подобные строки должны быть удалены:
libjp.a: pj.o pp.o
libgr.so: pg.o pr.o
Возможны другие подобные изменения.