天天看點

21、makefile常用文法講解(1)

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

繼續閱讀