Makefile学习(一)[第二版]
簡介
1)make:利用?make?工具可以自動完成編譯工作。這些工作包括:如果僅修改了某幾個源文件,則只重新編譯這幾個源文件[make通過比對相應的.c文件與.o文件的時間];如果某個頭文件被修改了,則重新編譯所有包含該頭文件的源文件。利用這種自動編譯可大大簡化開發工作,避免不必要的重新編譯。
2)Mackfile:make工具通過一個稱為?Mackfile?的文件來完成并自動維護編譯工作。Mackfile文件描述了整個工程的編譯、連接等規則。
?
Mackfile基本規則
Target?...:?Dependencies?...
Command?...
?
說明:
1)目標(TARGET):即最終想要產生的文件,如:可執行文件,目標文件或中間文件等;目標也可以是要執行的動作,如clean,也稱為偽目標。
2)依賴(DEPENDENCIES):為了產生目標文件而依賴的文件列表,一個目標通常依賴于多個文件。
3)命令(COMMAND):是make執行的動作(shell命令或是可在shell下執行的程序,如echo)。注意:每個命令行的起始字符必須為TAB字符!
如果DEPENDENCIES中有一個或多個文件更新的話,COMMAND就要執行,這就是Makefile最核心的內容.
?
簡單的Mackfile示例
?
#1?最簡單
hello:
gcc?-o?hello?hello.c
?
#2?稍微復雜
hello:hello.o
gcc?-o?hello?hello.o
?
hello.o:
gcc?-o?hello.o?-c?hello.c
?
#3?進一步完善
hello:hello.o
gcc?-o?hello?hello.o
?
hello.o:
gcc?-o?hello.o?-c?hello.c
?
clean:
rm?-rf?hello.o??#delete?file?hello.o
?
#4 在Mackfile中執行shell命令[@符號:不輸出命令本身]
hello:hello.o
gcc?-o?hello?hello.o
@echo?"--------------ok------------"
?
hello.o:
gcc?-o?hello.o?-c?hello.c
?
clean:
rm?-rf?hello.o??#delete?file?hello.o
?
#5?綜合[.PHONY:#顯示聲明偽目標]
.PHONY:?clean
main:?main.o?sub.o?add.o
gcc?-Wall?-g?-o?main?main.o?sub.o?add.o
?
main.o:?main.c
gcc?-Wall?-g?-o?main.o?-c?main.c
?
add.o:?add.c?add.h
gcc?-Wall?-g?-o?add.o?-c?add.c
?
sub.o:?sub.c?sub.h
gcc?-Wall?-g?-o?sub.o?-c?sub.c
?
clean:
rm?-f?main.o?sub.o?add.o
?
執行:
1)make #生成第一個目標
2)make?clean #“生成”clean偽目標
3)make?main.o #僅生成main.o目標
4)make?-f?Mackfile #顯示指定執行的文件名
?
Makefile變量
為了簡化和維護Mackfile,可以在Mackfile中使用變量,格式
varname=some_text
引用變量的值:$(varname)
按照慣例,在Mackfile中,變量一般大寫
?
?
Makefile自動化變量 | |
選項名 | 作用 |
$@ | 規則的目標文件名 |
$< | 規則的第一個依賴文件名 |
$^ | 規則的所有依賴文列表 |
$* | 不包括后綴名的當前依賴文件名 |
$? | 當前目標所依賴的文件列表中比當前目標文件還要新的文件 |
?
?
#綜合示例
.PHONY:?clean
.SUFFIXES:?.c?.o
.c.o:
????gcc?-Wall?-g?-o?$@?-c?$^
?
OBJECTS?=?main.o?sub.o?add.o
SOURCES?=?$(OBJECTS:.o=.c)
?
main:?$(OBJECTS)
????gcc?-Wall?-g?-o?$@?$^
?
clean:
????@echo?"delete?execute?file?and?object?file..."
????rm?-f?$(OBJECTS)?main
?
附-
.SUFFIXES:.c?.o #表示任何x.c文件與x.o文件關聯
?
Make使用隱含推導規則/生成多個可執行文件
#示例-生成多個可執行文件1
.PHONY:?clean?all?
?
BIN?=?01test?02test
?
all:?$(BIN)
?
clean:
????-rm?-f?$(BIN)
?
#示例-生成多個可執行文件2-使用自己定制的規則,生成.o中間文件
.PHONY:?clean?all?
?
BIN?=?01test?02test
OBJECTS?=?$(BIN:=.o)
?
all:?$(BIN)
?
01test.o:?01test.c
02test.o:?02test.c
?
clean:
-rm?-f?$(BIN)?$(OBJECTS)
?
#示例-生成多個可執行文件3-使用更加細致的規則
.PHONY:?clean?all?
????
CFLAGS?=?-g?-Wall
CC?=?gcc?
?
BIN?=?01test?02test
OBJECTS?=?$(BIN:=.o)
?
.SUFFIXES:?.c?.o
.c.o:
????$(CC)?$(CFLAGS)?-c?$<?-o?$@
?
all:?$(BIN)
?
01test.o:?01test.c
02test.o:?02test.c
?
clean:
????-rm?-f?$(BIN)?$(OBJECTS)
?
模式規則與后綴規則
%.o:%.c
.c.o:
?
#示例
.PHONY:?clean?all?
?
CC?=?gcc?
CFLAGS?=?-Wall?-g
BIN?=?01test?02test?
SOURCES?=?$(BIN:=.c)
OBJECTS?=?$(BIN:=.o)
?
all:?$(BIN)
?
01test:?01test.o
02test:?02test.o
?
#%.o:?%.c #模式規則
#???$(CC)?$(CFLAGS)?-c?$<?-o?$@
.c.o: #后綴規則,與前作用相同
????$(CC)?$(CFLAGS)?-c?$<?-o?$@
?
clean:
????-rm?-rf?$(BIN)?$(OBJECTS)?
總結
以上是生活随笔為你收集整理的Makefile学习(一)[第二版]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ×××门禁管理
- 下一篇: c#的Marshal