2012-07-26 84 views
1

我在談論this question這個人已經更新了他的最終解決方案,這是一個問題本身的任務makefile。我有一段時間瞭解它是如何完成的。 有一個規則爲瞭解一個makefile

$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c 
    @$(CC) $(CFLAGS) -c $< -o [email protected] 

對此我無法理解,但直覺我知道它會做。幾乎所有其他事情都非常清楚。謝謝!

+1

+1,不知道爲什麼,這是downvoted ... – 2012-07-26 19:05:19

回答

2

這是一個static pattern rule。第一場是目標列表,第二個是目標模式這使得使用分離目標的「幹」,第三是前提模式這使得用來構造先決條件列表。

假設你有

SRCDIR = src 
OBJDIR = obj 
OBJECTS = obj/foo.o obj/bar.o obj/baz.o 

$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c 
    @$(CC) $(CFLAGS) -c $< -o [email protected] 

如果make obj/foo.o,請首先識別這個規則的一個使用(因爲obj/foo.o是在目標列表中$(OBJECTS)),與它匹配對目標模式obj/%.o並發現詞幹(與通配符%匹配的部分)爲foo,然後將其插入prereq模式src/%.c,並發現先決條件爲src/foo.c

如果您還定義變量

CC = gcc 
CFLAGS = -thisflag -thatflag=something 

然後在規則的命令變爲

@gcc -thisflag -thatflag=something -c src/foo.c -o obj/foo.o 

(注意$<是第一要義和[email protected]是目標的名字。)

在回答您的其他問題:是的,一個makefile可以處理一個頭文件(x.h)的依賴,這樣我f頭部已被修改,Make將重建目標。不,這個Makefile沒有做到這一點。你可以手工修改Makefile,添加規則像

a.o: x.h 

假設你知道什麼是真正的夾雜物的,也可以有makefile文件自動執行,這是一種先進的技術,你應該還沒有嘗試。

1

該行解釋瞭如何從源文件(.c)獲取目標文件(.o),避免了必須重複每個.c文件的行。

對象將在OBJDIR和來源SRCDIR

$(CC)將包含編譯器,CFLAGS將包含編譯器的選項和-c告訴GCC編譯器源成對象。

例如:

  • CC = GCC

  • CFLAGS = -g -Wall

可以轉化成 GCC -g -Wall -c test.c的-o test.o

+0

還告訴我,這如何生成文件需要它們由用戶定義的考慮,如果在所有它'.h'文件。我的意思是在規則的目標列表中包含'.h'文件。 – 2012-07-26 17:02:47

+0

Makefile文件不處理.h文件。他們只需將.c文件傳遞給編譯器,該編譯器負責查找文件所需的包含。最Makefile文件做的是通過標誌來編譯器添加額外的包含路徑 – 2012-07-26 17:07:58

+0

@Aman深高塔姆:洛朗是正確的,Makefile中只產生一個等效串聯shell命令。包含文件夾通過-I傳遞,這是gcc的一個選項。大多數MakeFiles包含一個變量來表示包含文件夾。 – BlueTrin 2012-07-26 17:09:08