2016-10-03 5 views
0
SRC_DIRS += $(CMM_DIR) 
SRC_DIRS += $(ABC_DIR) 

VPATH = $(SRC_FILES) 

tear_abc123: $(OBJ)/ur23.o 
    $(CC) $(CFLAGS) -c $(subst tear_,,[email protected]) [email protected] [email protected]_compiletime.c -o [email protected] 

При этом [email protected]_compiletime.c (скажем tear_abc123_compiletime.c) генерируется до $ (CC). make выдает ошибку, что abc123.c не найден. где abc123.c присутствует в $ (ABC_DIR). Почему vpath не смог найти файл c.

+0

1) Линия 'VPATH $ @. С $ (SRC_FILES)' не имеет никакого смысла, нет нет равных символов , так что никакой переуступки. 2) 'VPATH' должен содержать путь к папкам, содержащим исходные файлы, а не путь к источникам. 3) Прочитайте [Правила Makefile] (http://make.mad-scientist.net/papers/rules-of-makefiles/). 4) То, что вы хотите, это 'VPATH = $ (SRC_DIRS)' где 'SRC_DIRS' содержит разные папки, содержащие ваши источники. – Tim

+0

Я изменил и VPATH все еще не находит файл. Выдает ошибку abc123.c нет такого файла или каталога –

+0

В вашем правлении 'VPATH' принимает значение' SRC_FILES', а не 'SRC_DIRS'. Пожалуйста, прочитайте [документацию VPATH] (https://www.gnu.org/software/make/manual/html_node/General-Search.html). VPATH - это список мест, где 'make' будет искать ваши исходные файлы. Если вы не сообщите 'make', где ваши источники, они не найдут их. – Tim

ответ

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 действительно содержит только исходные файлы имен
  • предпосылок автоматически замещено правильного путь