我在談論this question這個人已經更新了他的最終解決方案,這是一個問題本身的任務makefile。我有一段時間瞭解它是如何完成的。 有一個規則爲瞭解一個makefile
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
@$(CC) $(CFLAGS) -c $< -o [email protected]
對此我無法理解,但直覺我知道它會做。幾乎所有其他事情都非常清楚。謝謝!
我在談論this question這個人已經更新了他的最終解決方案,這是一個問題本身的任務makefile。我有一段時間瞭解它是如何完成的。 有一個規則爲瞭解一個makefile
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
@$(CC) $(CFLAGS) -c $< -o [email protected]
對此我無法理解,但直覺我知道它會做。幾乎所有其他事情都非常清楚。謝謝!
這是一個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文件自動執行,這是一種先進的技術,你應該還沒有嘗試。
該行解釋瞭如何從源文件(.c)獲取目標文件(.o),避免了必須重複每個.c文件的行。
對象將在OBJDIR和來源SRCDIR
$(CC)將包含編譯器,CFLAGS將包含編譯器的選項和-c告訴GCC編譯器源成對象。
例如:
CC = GCC
CFLAGS = -g -Wall
可以轉化成 GCC -g -Wall -c test.c的-o test.o
還告訴我,這如何生成文件需要它們由用戶定義的考慮,如果在所有它'.h'文件。我的意思是在規則的目標列表中包含'.h'文件。 – 2012-07-26 17:02:47
Makefile文件不處理.h文件。他們只需將.c文件傳遞給編譯器,該編譯器負責查找文件所需的包含。最Makefile文件做的是通過標誌來編譯器添加額外的包含路徑 – 2012-07-26 17:07:58
@Aman深高塔姆:洛朗是正確的,Makefile中只產生一個等效串聯shell命令。包含文件夾通過-I傳遞,這是gcc的一個選項。大多數MakeFiles包含一個變量來表示包含文件夾。 – BlueTrin 2012-07-26 17:09:08
+1,不知道爲什麼,這是downvoted ... – 2012-07-26 19:05:19