Makefile 使用說明

一、make 是啥?

make 是軟件構造工具,通過讀取 Makefile文件自動化完成構建。

二、make 核心?

target ... : prerequisites ...
? ? (TAB)command

1. target 名為目標文件,實際是Object File,或執行文件,以及標簽(Label)。
2. prerequisites 是target所依賴的文件或是目標。
如果 prerequisites 的修改時間比 target 更新,或者 target 文件不存在,command 被執行。首次執行 make 創建了 target 文件是因為 target 文件不存在,之后執行 make 會根據修改時間的屬性進行判斷,如更新了源碼內容,那么 command 還會再次執行。
這就是 Makefile 的規則和核心。

三、make 實例

標準的編譯過程:源文件先被編譯成目標文件,然后再由目標文件連接成可執行文件。

cc = gcc? ?
prom = calc? ?
deps = calc.h
obj = main.o getch.o getop.o stack.o?

$(prom): $(obj)? ? ? ?
? ? $(cc) -o $(prom) $(obj)? ??

main.o: main.c $(deps) ? ? ? ?
? ? $(cc) -c main.c

getch.o: getch.c $(deps)? ? ? ?
? ? $(cc) -c getch.c

getop.o: getop.c $(deps)? ? ? ?
? ? $(cc) -c getop.c

stack.o: stack.c $(deps)? ? ? ?
? ? $(cc) -c stack.c

我們發現所有.c都會被編譯成相同名稱的.o文件,可以根據該特點再對其做進一步的簡化:

cc = gcc
prom = calc
deps = calc.h
obj = main.o getch.o getop.o stack.o

$(prom): $(obj)
? ? $(cc) -o $(prom) $(obj)

%.o: %.c $(deps)
? ? $(cc) -c $< -o $@

1. %.o:%.c,這是一個模式規則,表示所有的.o目標都依賴于與它同名的.c文件(當然還有deps中列出的頭文件)。
2. $< 是依賴關系表中的第一項(如果我們想引用的是整個關系表,那么就應該使用$^),具體到我們這里就是%.c。
3. $@ 是當前語句的目標,即%.o。這樣一來,make命令就會自動將所有的.c源文件編譯成同名的.o文件。不用我們一項一項去指定了。整個代碼自然簡潔了許多。

如果我們需要往工程中添加一個.c或.h,可能同時就要再手動為obj常量再添加一個.o文件,如果這列表很長,代碼會非常難看,為此,我們需要用到Makefile中的函數,再次簡化:

cc = gcc? ?
prom = calc? ?
deps = $(shell find ./ -name"*.h")? ?
src = $(shell find ./ -name"*.c")? ?
obj = $(src:%.c=%.o)? ??

$(prom): $(obj)? ? ? ?
? ? $(cc) -o $(prom) $(obj)? ??

%.o: %.c $(deps)? ? ? ?
? ? $(cc) -c $< -o $@? ??

clean:? ? ? ?
? ? rm -rf $(obj) $(prom)

shell函數主要用于執行shell命令,具體到這里就是找出當前目錄下所有的.c和.h文件。而$(src:%.c=%.o)則是一個字符替換函數,它會將src所有的.c字串替換成.o,實際上就等于列出了所有.c文件要編譯的結果。

四、make 執行過程

man make:
... ...
-d? Print? debugging? information in addition to normal processing.? The debugging information says which files are being considered for remaking, which file-times are being compared and with what?results, which files actually need to be remade, which implicit rules are considered and which are applied---everything interesting about how make decides what to do.

基本信息輸出:make --debug=b

詳細信息輸出:make -d

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,107評論 2 375

推薦閱讀更多精彩內容