Да, вы можете явно добавлять имена папок к целям и командам как @bruno, но это немного похоже на жесткое кодирование, плюс добавляет немного дублирования.Чтобы улучшить это, используйте VPATH
или vpath-функцию , которая подходит для этого случая:
vpath %.h includes
vpath %.c src:srclib
vpath %.o lib
Указывает, в каком каталоге искать файлы определенного типа.Для файлов .c он будет искать как «src», так и «srclib».
Теперь правила могут выглядеть проще:
cliente.o : cliente.c tcp.h
$(GCC) -c -o lib/$@ -I includes $<
Обратите внимание на использование $@
и $<
автоматические переменные .В этом случае $<
расширится до первого необходимого пути с каталогом - "lib / cliente.c", а $@
будет просто именем цели - "cliente.o".
Если вы напишитеправила так, что вы можете в конечном итоге, что все ваши правила выглядят одинаково, и подумать о рефакторинге его дальше, чтобы просто одно неявное правило шаблона %.o: %.c
.