標籤:linux 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自動化變數 |
|
選項名 |
作用 |
|
[email protected] |
規則的目標檔案名 |
|
$< |
規則的第一個依賴檔案名稱 |
|
$^ |
規則的所有依賴文列表 |
|
$* |
不包括尾碼名的當前依賴檔案名稱 |
|
$? |
當前目標所依賴的檔案清單中比當前目標檔案還要新的檔案 |
#綜合樣本
.PHONY: clean
.SUFFIXES: .c .o
.c.o:
gcc -Wall -g -o [email protected] -c $^
OBJECTS = main.o sub.o add.o
SOURCES = $(OBJECTS:.o=.c)
main: $(OBJECTS)
gcc -Wall -g -o [email protected] $^
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 [email protected]
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 [email protected]
.c.o:#尾碼規則,與前作用相同
$(CC) $(CFLAGS) -c $< -o [email protected]
clean:
-rm -rf $(BIN) $(OBJECTS)
Makefile學習(一)[第二版]