#makefile #gnu-make
#makefile #gnu-make
Вопрос:
SRC_DIRS = $(CMM_DIR)
SRC_DIRS = $(ABC_DIR)
VPATH = $(SRC_FILES)
tear_abc123: $(OBJ)/ur23.o
$(CC) $(CFLAGS) -c $(subst tear_,,$@.c) $@.c $@_compiletime.c -o $@
В этом случае $ @_compiletime.c (скажем, tear_abc123_compiletime.c) генерируется перед $(CC). make выдает ошибку, что abc123.c не найден. где abc123.c присутствует в $(ABC_DIR). Почему vpath не может найти файл c.
Комментарии:
1. 1) Строка
vpath $@.c $(SRC_FILES)
не имеет смысла, в ней нет символа равенства, поэтому присвоения нет. 2)VPATH
должен содержать путь к папкам, содержащим исходные файлы, а не путь к источникам. 3) Прочитайте правила Makefile . 4) То, что вы хотитеVPATH = $(SRC_DIRS)
, — это то, гдеSRC_DIRS
хранятся разные папки, содержащие ваши исходники.2. Я изменился, и VPATH по-прежнему не может найти файл. Выдает ошибку abc123.c нет такого файла или каталога
3. В вашей правке
VPATH
принимает значениеSRC_FILES
notSRC_DIRS
. Пожалуйста, ознакомьтесь с документацией VPATH. VPATH — это список мест, гдеmake
будут искать ваши исходные файлы. Если вы не укажетеmake
, где находятся ваши источники, он их не найдет.
Ответ №1:
Основная проблема заключается в том, что 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
деле содержит только имена исходных файлов - предварительные условия автоматически заменяются правильным путем