makefile基礎和工作常用點補充

s1mba發表於2015-01-23

一、Makefile簡介

Makefile是什麼,能做什麼用,為什麼要用?

定義編譯規則、自動化編譯、提高效率

組織檔案

Makefile由一組規則(Rule)組成,每條規則的格式是:


例如:



依賴關係如下圖:


注意:

(1) 當我們為了執行命令而非建立目標檔案時,就會使用偽目標比如 clean,偽目標總是被執行。".PHONY" 的作用是避免和當前

目錄下的檔名衝突 (可能引發隱式規則)。

(2) 使用 "-" 字首可以忽略命令錯誤,比如建立已有的路徑; “@” 可以不顯示命令本身

(3) Makefile 中 $、# 有特殊含義,可以進行轉義 "\#"、"$$"。

(4) 可以使用 \ 換行 (註釋行也可以使用),但其後不能有空格,新行同樣必須以 Tab 開頭和縮排。

(5) 在工作目錄按 "GNUmakefile、makefile、Makefile (推薦)" 順序查詢執行,或 -f 指定。

(6) 如果不在 make 命令列顯式指定目標規則名,則預設使用第一個有效規則。

(7) 每條命令都在一個獨立 shell 環境中執行,如希望在同一 shell 執行,可以用 ";" 將命令寫在一行,也可用\ 換行。

(8) 在makefile 常見的gcc/g++引數 -D 即條件編譯; -static 使用靜態庫;注意 -L../lib -ldown  與 ../lib/libdown.so 等同


二、Makefile基本使用

make規則

沒被編譯過,則編譯;只編譯修改過的檔案

標頭檔案被改變,只編譯包含該標頭檔案的檔案

常用選項 : -C dir    -f fileName  -n 顯示待執行的命令,但不執行

Makefile組成

顯式規則:生成、依賴檔案,生成命令

隱含規則:make支援的自動推導功能, make –p 列印


        

變數定義:類C中巨集作用(?=   :=  +=)。 引用方式 $(var) 或 ${var}。

  "="   遞迴展開變數,僅在目標展開時才會替換,也就是說它可以引用在後面定義的變數。

 ":=" 直接展開變數,在定義時就直接展開,它無法後置引用。

"?=" 表示變數為空或未定義時才進行賦值操作。

"+=" 追加賦值,也是遞迴展開

執行shell命令賦值給變數 A = $(shell uname)

檔案包含:include

 註釋:    “#”

特殊變數:



三、Makefile 工作常用點補充


搜尋路徑

VPATH 變數  VPATH = ./src : ./lib

vpath關鍵字(vpath<pattern> <directories> vpath %.h ../inc

vpath %.c ./src : ./lib # 定義匹配模式(%匹配任意個字元)和搜尋路徑。
vpath %.c  # 取消該模式
vpath  # 取消所有模式

VPATH 和 vpath 定義的搜尋路徑僅對 makefile 規則有效,對 gcc/g++ 命令列無效,比如不能用它定義命令列標頭檔案搜尋路徑引數。


變數引用與替換

 obj=$(dir:%.c=%.o) 可以將變數 dir 中所有以 c 結尾的單詞替換成以 o 結尾

$(addprefix src/, foo  bar)  返回值為src/foo src/bar”

src=$(wildcard *.c ./sub/*.c)

dir=$(notdir $(src))

obj=$(patsubst %.c,%.o,$(dir))

             $(^D)

          $(^F)
                    分別表示所有依賴檔案的目錄部分和檔案部分。(無相同的)


條件判斷

conditional-directive

text-if-true

else

text-if-false

endif

ifeq ($(CC),gcc) # 是否相等

ifdef CC   # 變數是否定義


自動推導依賴關係

gcc –M main.c

自動生成目標檔案和原始檔的依賴關係; -MM去除系統標頭檔案的依賴關係


maze.d,其內容是 maze.o maze.d:maze.c maze.h main.h



參考:
《linux c 程式設計一站式學習》
《C 學習筆記》 by雨痕


相關文章