Основная проблема заключается в том, что VPATH
работает только для предварительных условий. И это не работает из части «команды» цели.
Чтобы выполнить работу VPATH
, вы должны указать список источников в Предварительных требованиях и указать его в команде с помощью $^
.
Пожалуйста, смотрите следующий пример (для дерева файлов, как показано ниже)
.
|-- abc
| |-- abc123.c
| |-- tear_abc123.c
| `-- tear_abc123_compiletime.c
`-- Makefile
Makefile содержит
SRC_DIRS := abc
VPATH := $(SRC_DIRS)
TARGET := tear_abc123
SOURCE_FILES := $(TARGET).c $(TARGET)_compiletime.c $(subst tear_,,$(TARGET).c)
tear_abc123: $(SOURCE_FILES)
@echo "SOURCE_FILES := $(SOURCE_FILES)"
@echo "prerequisites = $^"
Выход будет
$ make
SOURCE_FILES := tear_abc123.c tear_abc123_compiletime.c abc123.c
prerequisites = abc/tear_abc123.c abc/tear_abc123_compiletime.c abc/abc123.c
Как вы можете видеть
- в
SOURCE_FILES
действительно содержит только исходные файлы имен
- предпосылок автоматически замещено правильного путь
1) Линия 'VPATH $ @. С $ (SRC_FILES)' не имеет никакого смысла, нет нет равных символов , так что никакой переуступки. 2) 'VPATH' должен содержать путь к папкам, содержащим исходные файлы, а не путь к источникам. 3) Прочитайте [Правила Makefile] (http://make.mad-scientist.net/papers/rules-of-makefiles/). 4) То, что вы хотите, это 'VPATH = $ (SRC_DIRS)' где 'SRC_DIRS' содержит разные папки, содержащие ваши источники. – Tim
Я изменил и VPATH все еще не находит файл. Выдает ошибку abc123.c нет такого файла или каталога –
В вашем правлении 'VPATH' принимает значение' SRC_FILES', а не 'SRC_DIRS'. Пожалуйста, прочитайте [документацию VPATH] (https://www.gnu.org/software/make/manual/html_node/General-Search.html). VPATH - это список мест, где 'make' будет искать ваши исходные файлы. Если вы не сообщите 'make', где ваши источники, они не найдут их. – Tim