1、make是一個解釋makefile中指令的指令工具。Make工具最主要也是最基本的功能就是通過makefile檔案來描述源程式之間的互相關系并自動維護編譯工作。而makefile 檔案需要按照某種文法進行編寫,檔案中需要說明如何編譯各個源檔案并連接配接生成可執行檔案,并要求定義源檔案之間的依賴關系。
Makefile 裡主要包含了五種類型的語句/行:顯式規則、隐式規則、變量定義、檔案訓示和注釋。
make指令格式:make [-f Makefile] [option] [target]
2、編譯和連結規則
1)如果這個工程沒有編譯過,那麼我們的所有C檔案都要編譯并被連結。
2)如果這個工程的某幾個C檔案被修改,那麼我們隻編譯被修改的C檔案,并連結目标程式。
3)如果這個工程的頭檔案被改變了,那麼我們需要編譯引用了這幾個頭檔案的C檔案,并連結目标程式。
3、makefile的構成
(1)需要由make工具建立的目标體(target),通常是目标檔案或可執行檔案。
(2)要建立的目标體所依賴的檔案(dependency_file)。
(3)建立每個目标體時需要運作的指令(command)。
格式如下:
target:dependency_files
<TAB>command
在這裡面,變量一般都是字元串,他有點像c語言的宏。
makefile中的檔案訓示,包含3部分,一個是在一個Makefie中引用另一個Makefile,就像c語言的include一樣;另一個是根據某些情況指定Makefile中的有效部分,就像C語言中的預編譯#if一樣;還有就是定義一個多行的指令。
注釋:注釋符用"#",可以用反斜框進行轉義,如輸入注釋,“\#”。
4、makefile的書寫
1)所有檔案都在一個目錄中
示例
st_work : main.o st_work.o fun.o
gcc main.o st_work.o fun.o -o st_work main (指令以Tab開頭)
st_work.o : st_work.c
gcc -c st_work.c -o st_work
main.o : main.c st_work.h
gcc -c main.c -o main.o
fun.o : fun.c fun.h
gcc -c fun.c -o fun.o
clean:
rm -f st_work *.o
2)多目錄的寫法
我們這裡,在工作目錄下有4個檔案夾 分别是 sources(源檔案) obj (中間檔案)headers(頭檔案) bin(目标檔案)
sources裡面有 main.c st_work.c fun.c
obj 裡面最初沒有檔案
headers 裡面有 fun.h st_work.h
最終目标取名為 st_work,它應存放到bin裡面
預備知識:
gcc 的3個參數:
1. -o 指定目标檔案
gcc sources/main.c -o bin/main
2. -c 編譯的時候隻生産目标檔案不連結
gcc -c sources/main.c -o obj/main.o
3. -I 主要指定頭檔案的搜尋路徑
gcc -I headers -c main.c -o main.o
4. -l 指定靜态庫
gcc -lpthread ...
bin/st_work : obj/main.o obj/st_work.o obj/fun.o
gcc obj/main.o obj/st_work.o obj/fun.o -o bin/st_work (指令以Tab開頭)
obj/st_work.o : sources/st_work.c
gcc -I headers -c sources/st_work.c -o obj/st_work.o
obj/main.o : sources/main.c
gcc -I headers -c sources/main.c -o obj/main.o
obj/fun.o : sources/fun.c
gcc -I headers -c sources/fun.c -o obj/fun.o
rm -f bin/st_work obj/*.o
3)隐式規則的引入
3個預定義變量介紹:
1. $@ 表示要生成的目标
2. $^ 表示全部的依賴檔案
3. $< 表示第一個依賴檔案
gcc $^ -o $@ (指令一定要用以Tab開頭)
gcc -I headers -c $< -o $@
obj/main.o : sources/main.c
obj/fun.o : sources/fun.c