2015-06-11 111 views
0

我想寫一個Makefile,當我在應用程序中添加一些代碼時,我只需要更改DEPS_NAME變量,但是出現了一些錯誤,我找不出什麼。我知道這不是這個Makefile的唯一問題,我剛開始學習這個技術。Makefile:沒有規則使目標變量

這是我的項目結構

application/ 
├── deps/ 
│ ├── buffer/ 
│ │ ├── buffer.c 
│ │ └── buffer.h 
│ └── other/ 
│  ├── other.c 
│  └── other.h 
├── objs/ 
├── application.c 
└── Makefile 

這是我的Makefile

CC = gcc 
APP_NAME = application 

OBJS_PATH = objs 
DEPS_PATH = deps 
DEPS_NAME = buffer other 

DEPS = $(patsubst %,$(OBJS_PATH)/%.o,$(DEPS_NAME)) 

$(OBJS_PATH)/%.o: $(DEPS_PATH)/%/%.c 
    $(CC) -o [email protected] -c $^ 

$(APP_NAME): $(DEPS) 
    $(CC) -o [email protected] [email protected] $^ 

all: $(APP_NAME) 

這是當我鍵入做出錯誤:

make: *** No rule to make target `objs/buffer.o', needed by `application'. Stop. 
+0

如果'buffer.c'需要其他.h中的任何信息 - 或other.c需要buffer.h中的任何信息,那麼這個makefile在連接步驟中也會失敗。可以在makefile中使用當前文件/目錄體系結構,但如果所有頭文件都位於同一目錄中的目錄和所有源文件中,則編寫生成文件會更容易。 – user3629249

+0

@ user3629249感謝您的建議,但問題並未出現,因爲代表是獨立的。 – wsknorth

回答

0

把目標文件的源文件相同的目錄我解決了這個問題,這個Makefile

CC = gcc 
CFLAGS = -Ideps 
APP_NAME = application 

DEPS_SOURCE = $(wildcard deps/*/*.c) 
DEPS_OBJECT = $(DEPS_SOURCE:.c=.o) 

all: $(APP_NAME) 

$(APP_NAME): $(DEPS_OBJECT) 
    $(CC) [email protected] -o [email protected] $(DEPS_OBJECT) $(CFLAGS) 

%.o: %.c 
    $(CC) -o [email protected] -c $^ 

clean: 
    rm -f $(DEPS_OBJECT) $(APP_NAME) 

.PHONY: all clean 

白衣這個解決方案,我沒有改變Makefile文件,當我在項目中添加其他DEPS 。

0

,直到你已經確定的根本原因的問題,爲每個* .c到* .o編譯步驟建議一個單獨的目標。

您希望'all'目標成爲makefile中的第一個目標。 (這是一個「所有」的目標是什麼,這樣可以調用與生成文件:

make 

沒有在make文件中指定的目標

注:「所有」是假目標(生產沒有名爲「全部」)文件 所以應寫入類似:

.PHONY: all 
all : $(app_name) $(DEPS) 

當make執行編譯步驟(S) 它需要知道如何找到頭文件 和自報頭F。 iles分散, 可能建議1)在編譯規則中列出所有的路徑/ *。h文件(簡單但可能導致不需要的編譯)或2)生成依賴文件(困難但最好的文件計數增長)或3)爲每個源文件編寫單獨的編譯規則。 (最不靈活,但對於那些新的製作來說很容易)

編譯規則需要有指示在哪裏找到頭文件的參數。 (在gcc中,使用'-I./other/。'和'-I./buffer/。)

0

我從來沒有見過多個詞幹參考。看起來它嚴重混淆瞭解析器。

在一個光明的一面,似乎

$(OBJS_PATH)/%.o: $($(DEPS_PATH)/%/%.c) 

的伎倆。不要問我爲什麼。