【編譯】makefile使用

本文重在記錄makefile的使用方法旺聚,不介紹相關原理乡数。
注意:所有的makefile指令前面都需要兩個 tab 縮進


1.初步使用

創(chuàng)建工作目錄色洞,工作目錄下創(chuàng)建如下兩個文件:
main.c

#include <stdio.h>
int main()
{
    printf("打印\n");
}

makefile 或 Makefile

app : main.o
    cc -o app main.o

main.o : main.c
    cc -c main.c
clean :
    rm app main.o

說明:
app : mian.o
一種依賴關系的聲明贞言,生成程序app需要依賴 main.o 文件。
cc -o app main.o
一個終端命令糕篇, 執(zhí)行該命令啄育,gcc使用main.o文件生成app
main.o : main.c
同理,依賴關系聲明拌消,生成main.o需要main.c文件
cc -c main.c
使用gcc編譯main.c文件挑豌,生成二進制文件main.o
clean :
清除命令,不依賴任何文件
rm app main.o
清除編譯鏈接生成的所有文件墩崩,類似于xcode的command+shift+k

執(zhí)行流程
$ make
在工作目錄下執(zhí)行make命令氓英,make命令會按照makefile文件中的規(guī)則執(zhí)行,首先是app:main.o,依賴關系聲明生成app需要main.o文件鹦筹,make命令檢查main.o是否存在(是否最新)

  • 如果存在(或最新)铝阐,則執(zhí)行表達式 cc -o app mian.c命令,生成app盛龄;
  • 如果不存在(或不是最新)饰迹,則去生成main.o

main.o生成,檢查依賴余舶,main.c是否存在(或最新)

  • 如果存在(或最新)啊鸭,則執(zhí)行表達式 cc -c mian.c命令,生成mian.o匿值;
  • 如果不存在赠制,則報錯

以上所有的命令都可以單獨執(zhí)行,如:
$ make main.o
$ make clean

2.簡化使用

創(chuàng)建工作目錄挟憔,包含如下文件:

  • main.c
  • person.c
  • a.h
  • b.h

1.文件內容钟些,main.c同上,其他空文件即可绊谭。
創(chuàng)建makefile

app : main.o person.o other.o
    cc -o app main.o person.o other.o

main.o : main.c
    cc -c main.c a.h

person.o : person.c a.h b.h
    cc -c person.c

other.o : person.c b.h
    cc -c person.c -o other.o

clean :
    rm app main.o person.o other.o

2.定義變量政恍,代替目標文件,簡化代碼达传,如下:

objects = main.o person.o other.o

app : $(objects)
    cc -o app $(objects)

main.o : main.c
    cc -c main.c a.h

person.o : person.c a.h b.h
    cc -c person.c

other.o : person.c b.h
    cc -c person.c -o other.o

clean :
    rm app $(objects)

3.使用makefile的自動推導機制篙耗,簡化指令語句:

因為在編譯過程中,哪些類型文件的編譯需要哪些指令是固定的宪赶,所以makefile可以從依賴關系自動推導出后面要執(zhí)行的語句

簡化如下:

objects = main.o person.o 

app : $(objects)
    cc -o app $(objects)

main.o : main.c
person.o : person.c a.h b.h

clean :
    rm app $(objects)

只有依賴聲明下面沒有任何語句宗弯,makefile才會自動推導,否則執(zhí)行指定語句

注意:這里去掉了other.o,是因為搂妻,前面other.o依賴person.c 手動指定生成other.o蒙保,這里makefile只會生成和依賴文件相同名字的 .o 文件。

4.如果我們的文件不在一個目錄欲主,需要指定目錄邓厕,只需要在makefile文件中第一行添加

VPATH = path1:path2:path3

makefile會自行按照路徑順序逝嚎,依次查找文件。

5.最終版

VPATH = ./subfile:./otherPath
#這是一個注釋
CC = gcc #設置編譯器

objects = main.o person.o

app : $(objects)
    $(CC) -o app $(objects) #使用設定的編譯器編譯
    @echo "輸出信息:編譯完成"

main.o : main.c

person.o : person.c a.h b.h

.PHONY : clean #說明虛擬標號邑狸,表示clean不出現(xiàn)在依賴樹中

clean :
    rm app $(objects)

參考資料
makefile書寫入門

比較全面的資料
makefile-1
makefile-2
makefile-3
makefile-4
makefile-5
makefile-6

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末懈糯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子单雾,更是在濱河造成了極大的恐慌赚哗,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硅堆,死亡現(xiàn)場離奇詭異屿储,居然都是意外死亡,警方通過查閱死者的電腦和手機渐逃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門够掠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茄菊,你說我怎么就攤上這事疯潭。” “怎么了面殖?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵竖哩,是天一觀的道長。 經常有香客問我脊僚,道長相叁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任辽幌,我火速辦了婚禮增淹,結果婚禮上,老公的妹妹穿的比我還像新娘乌企。我一直安慰自己虑润,他們只是感情好,可當我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布加酵。 她就那樣靜靜地躺著端辱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪虽画。 梳的紋絲不亂的頭發(fā)上撒犀,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天脑豹,我揣著相機與錄音,去河邊找鬼饱亮。 笑死个盆,一個胖子當著我的面吹牛脖岛,可吹牛的內容都是我干的朵栖。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼柴梆,長吁一口氣:“原來是場噩夢啊……” “哼陨溅!你這毒婦竟也來了?” 一聲冷哼從身側響起绍在,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤门扇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后偿渡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臼寄,經...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年溜宽,在試婚紗的時候發(fā)現(xiàn)自己被綠了吉拳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡适揉,死狀恐怖留攒,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情嫉嘀,我是刑警寧澤炼邀,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布,位于F島的核電站吃沪,受9級特大地震影響汤善,放射性物質發(fā)生泄漏。R本人自食惡果不足惜票彪,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一红淡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧降铸,春花似錦在旱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谅畅,卻和暖如春登渣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毡泻。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工胜茧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓呻顽,卻偏偏與公主長得像雹顺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子廊遍,可洞房花燭夜當晚...
    茶點故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內容

  • 來自陳浩的一片老文嬉愧,但絕對營養(yǎng)。 示例工程:3 個頭文件*.h喉前,和 8 個 C 文件*.c没酣。 初 編譯過程,源文件...
    周筱魯閱讀 4,690評論 0 17
  • 轉自嵌入式RAM 學號:16020311003论颅。姓名:楊虎成【嵌牛導讀】makefile帶來的好處就是——“自動化...
    遇曉閱讀 2,212評論 1 4
  • makefile關系到整個工程的編譯規(guī)則哎垦,一個工程中的源文件不計其數(shù),按其類型恃疯、功能漏设、模塊分別放在若干的目錄當中,...
    Joe_HUST閱讀 1,876評論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理今妄,服務發(fā)現(xiàn)郑口,斷路器,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 感恩今天一大早愛人就把飯做好了盾鳞,他昨晚上又晚睡犬性,熬夜對身體不好,我批評了他腾仅,罰他早上做飯乒裆,隨口一說而已,今早真早早...
    寸心潔白閱讀 240評論 2 5