2016-10-03 100 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] 

在此,在$(CC)之前生成[email protected]_compiletime.c(比如說tear_abc123_compiletime.c)。使拋出一個錯誤,沒有找到abc123.c。其中abc123.c存在於$(ABC_DIR)中。爲什麼vpath無法找到c文件。

+0

1)行'VPATH $ @。C $(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真的只包含源文件名
  • 的先決條件自動與正確的路徑