2017-08-29 78 views
0

我有這些文件main.c,fun.cfun.h。我想使用makefile腳本來運行而不是傳統的編譯方式。發佈以下makefile腳本的人表示,此腳本會自動捕獲同一目錄中的文件名,所以我只需導航到項目目錄並在終端$ make中寫入。我創建了一個文件makefile,把下面的腳本:Makefile腳本無法正常運行

TARGET = prog 
LIBS = -lm 
CC = gcc 
CFLAGS = -g -Wall 

.PHONY: default all clean 

default: $(TARGET) 
all: default 

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c)) 
HEADERS = $(wildcard *.h) 

%.o: %.c $(HEADERS) 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

.PRECIOUS: $(TARGET) $(OBJECTS) 

$(TARGET): $(OBJECTS) 
    $(CC) $(OBJECTS) -Wall $(LIBS) -o [email protected] 

clean: 
    -rm -f *.o 
    -rm -f $(TARGET) 

不過,我得到這個錯誤: make: *** No rule to make target默認」。 Stop.`

我試圖$make -v,並得到:

GNU Make 3.81 
Copyright (C) 2006 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. 
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A 
PARTICULAR PURPOSE. 

This program built for i386-apple-darwin11.3.0 

我想我誤會他了!請問,這裏缺少什麼?謝謝

+0

Makefiles是**不是**腳本...我會考慮使用它們**非常傳統(但是您只是編譯任何名爲'* .c'的方法絕對不是傳統的...) –

+0

你的'默認'目標btw在這個Makefile中根本沒有任何用處。爲什麼不直接寫'all:$(TARGET)'作爲第一條規則? –

+2

對於我來說,看起來是正確的,只要記住,在Makefile中,那些空格(按順序4個空格)必須是標籤('\ t')。 – Amadeus

回答

2

缺少分隔符錯誤是因爲您沒有使用「配方」選項卡。例如,你的TARGET目標具有$(OBJECTS)的先決條件,一旦Make知道存在(或創建它),那麼它將繼續到配方。

$(TARGET): $(PREREQUISITES) 
    ->(TAB) $(RECIPE) 
+0

正確。我也發現了這一點。謝謝 – Medo

+0

沒問題,我只會評論,但沒有代表!玩的開心! –