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文件。
答案 0 :(得分: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
实际上只包含源文件名