Makefile(一)

Make介紹

摘自:

http://www.reibang.com/p/2cd82c90d184

1壮啊、什么是 Makefile

? 一個(gè)企業(yè)級(jí)項(xiàng)目乐横,通常會(huì)有很多源文件蕴坪,有時(shí)也會(huì)按功能、類型瓣俯、模塊分門(mén)別類的放在不同的目錄中夹抗,有時(shí)候也會(huì)在一個(gè)目錄里存放了多個(gè)程序的源代碼外莲。

這時(shí),如何對(duì)這些代碼的編譯就成了個(gè)問(wèn)題兔朦。Makefile 就是為這個(gè)問(wèn)題而生的偷线,它定義了一套規(guī)則,決定了哪些文件要先編譯沽甥,哪些文件后編譯声邦,哪些文件要重新編譯。

整個(gè)工程通常只要一個(gè) make 命令就可以完成編譯摆舟、鏈接亥曹,甚至更復(fù)雜的功能邓了。可以說(shuō)媳瞪,任何一個(gè) Linux 源程序都帶有一個(gè)Makefile 文件骗炉。

2、Makefile 的優(yōu)點(diǎn)

管理代碼的編譯蛇受,決定該編譯什么文件句葵,編譯順序,以及是否需要重新編譯兢仰;節(jié)省編譯時(shí)間乍丈。如果文件有更改,只需重新編譯此文件即可把将,無(wú)需重新編譯整個(gè)工程轻专;一勞永逸。Makefile 通常只需編寫(xiě)一次察蹲,后期就不用過(guò)多更改请垛。

3、命名規(guī)則

一般來(lái)說(shuō)將 Makefile 命名為 Makefile 或 makefile 都可以洽议,但很多源文件的名字是小寫(xiě)的宗收,所以更多程序員采用的是 Makefile 的名字,因?yàn)檫@樣可以將 Makefile 居前顯示绞铃。

如果將 Makefile 命為其它名字镜雨,比如 Makefile_demo嫂侍,也是允許的儿捧,但使用的時(shí)候應(yīng)該采用以下方式:

make -f? Makefile_demo

4、基本規(guī)則

Makefile 的基本格式為:

目標(biāo): 依賴

(tab)規(guī)則

目標(biāo) --> 需要生成的目標(biāo)文件

依賴 --> 生成該目標(biāo)所需的一些文件

規(guī)則 --> 由依賴文件生成目標(biāo)文件的手段

tab --> 每條規(guī)則必須以 tab 開(kāi)頭挑宠,使用空格不行

例如我們經(jīng)常寫(xiě)的 gcc test.c -o test菲盾,使用 Makefile 可以寫(xiě)成:

test: test.c

gcc test.c -o test

其中,第一行中的 test 就是要生成的目標(biāo)各淀,test.c 就是依賴懒鉴,第二行就是由 test.c 生成 test 的規(guī)則。

Makefile 中有時(shí)會(huì)有多個(gè)目標(biāo)碎浇,但 Makefile 會(huì)將第一個(gè)目標(biāo)定為終極目標(biāo)临谱。

5、工作原理

目標(biāo)的生成

檢查規(guī)則中的依賴文件是否存在奴璃;

若依賴文件不存在悉默,則尋找是否有規(guī)則用來(lái)生成該依賴文件。


比如上圖中苟穆,生成 calculator 的規(guī)則是 gcc main.o add.o sub.o mul.o div.o -o抄课,Makefile 會(huì)先檢查 main.o唱星、add.o、sub.o跟磨、 mul.o间聊、 div.o 是否存在,如果不存在抵拘,就會(huì)再尋找是否有規(guī)則可以生成該依賴文件哎榴。

比如缺少了 main.o 這個(gè)依賴,Makefile 就會(huì)在下面尋找是否有規(guī)則生成 main.o仑濒。當(dāng)它發(fā)現(xiàn) gcc main.c -o main.o這條規(guī)則可以生成 main.o 時(shí)叹话,它就利用此規(guī)則生成 main.o,然后再生成終極目標(biāo) calculator墩瞳。

整個(gè)過(guò)程是向下尋找依賴驼壶,再向上執(zhí)行命令,生成終極目標(biāo)喉酌。

目標(biāo)的更新

檢查目標(biāo)的所有依賴热凹,任何一個(gè)依賴有更新時(shí),就重新生成目標(biāo)泪电;

目標(biāo)文件比依賴文件時(shí)間晚般妙,則需要更新。


比如相速,修改了 main.c碟渺,則 main.o 目標(biāo)會(huì)被重新編譯,當(dāng) main.o 更新時(shí)突诬,終極目標(biāo) calculator 也會(huì)被重新編譯苫拍。其它文件的更新也是類推。

6旺隙、命令執(zhí)行

make:使用此命令即可按預(yù)定的規(guī)則生成目標(biāo)文件绒极。 如果 Makefile 文件的名字不為 Makefile 或 makefile,則應(yīng)加上 -f 選項(xiàng)蔬捷,比如:

make -f Makefile_demo

make clean:清除編譯過(guò)程中產(chǎn)生的中間文件(.o文件)及最終目標(biāo)文件垄提。

如果當(dāng)前目錄下存在名為 clean 的文件,則該命令不執(zhí)行周拐。

解決辦法是偽目標(biāo)聲明:.PHONY:clean铡俐。

特殊符號(hào):

- :表示此命令即使執(zhí)行出錯(cuò),也依然繼續(xù)執(zhí)行后續(xù)命令妥粟。如:-rm a.o build/

@:表示該命令只執(zhí)行审丘,不回顯。一般規(guī)則執(zhí)行時(shí)會(huì)在終端打印出正在執(zhí)行的規(guī)則罕容,而加上此符號(hào)后將只執(zhí)行命令备恤,不回顯執(zhí)行的規(guī)則稿饰。如:@echo $(SOURCE)

7、普通變量

變量定義及賦值

變量直接采用賦值的方法即可完成定義露泊,如:

INCLUDE = ./include/

變量取值:

? ? ? ? ? 用括號(hào)括起來(lái)再加個(gè)美元符喉镰,如:

? ? ? ? ? FOO = $(OBJ)

系統(tǒng)自帶變量:

通常都是大寫(xiě),比如 CC惭笑、PWD侣姆、CFLAG,等等沉噩。

有些有默認(rèn)值捺宗,有些沒(méi)有。比如常見(jiàn)的幾個(gè):

CPPFLAGS : 預(yù)處理器需要的選項(xiàng) 如:-I

CFLAGS:編譯的時(shí)候使用的參數(shù) –Wall –g -c

LDFLAGS :鏈接庫(kù)使用的選項(xiàng) –L -l

變量的默認(rèn)值可以修改川蒙,比如 CC 默認(rèn)值是 cc蚜厉,但可以修改為 gcc:CC=gcc

8、自動(dòng)變量

常用自動(dòng)變量:

Makefile 提供了很多自動(dòng)變量畜眨,但常用的為以下三個(gè)昼牛。這些自動(dòng)變量只能在規(guī)則中的命令中使用,其它地方使用都不行康聂。

$@ --> 規(guī)則中的目標(biāo)

$< --> 規(guī)則中的第一個(gè)依賴條件

$^ --> 規(guī)則中的所有依賴條件

例如:

app: main.c func1.c fun2.c ?gcc $^ - o $@

其中:$^ 表示 main.c func1.c fun2.c贰健,$< 表示 main.c,$@ 表示 app恬汁。

模式規(guī)則:

模式規(guī)則是在目標(biāo)及依賴條件中使用 % 來(lái)匹配對(duì)應(yīng)的文件伶椿,比如在目錄下有 main.c、func1.c氓侧、func2.c 三個(gè)文件脊另,對(duì)這三個(gè)文件的編譯可以由一條規(guī)則完成:

%.o:%.c ? $(CC) –c $< -o $@

這條模式規(guī)則表示:

main.o 由 main.c 生成, ? func1.o 由 func1.c 生成甘苍, ? func2.o 由 func2.c 生成尝蠕。

這就是模式規(guī)則的作用烘豌,可以一次匹配目錄下的所有文件载庭。

9、函數(shù)

Makefile 也為我們提供了大量的函數(shù)廊佩,同樣經(jīng)常使用到的函數(shù)為以下兩個(gè)囚聚。需要注意的是,Makefile 中所有的函數(shù)必須都有返回值标锄。在以下的例子中顽铸,假如目錄下有 main.c、func1.c料皇、func2.c 三個(gè)文件谓松。

通配符:

用于查找指定目錄下指定類型的文件星压,跟的參數(shù)就是目錄+文件類型,比如:

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

這句話表示:找到 ./src 目錄下所有后綴為 .c 的文件鬼譬,并賦給變量 src娜膘。

命令執(zhí)行完成后,src 的值為:main.c func1.c fun2.c优质。

patsubst:

匹配替換竣贪,例如以下例子,用于從 src 目錄中找到所有 .c 結(jié)尾的文件巩螃,并將其替換為 .o 文件演怎,并賦值給 obj。

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

命令執(zhí)行完成后避乏,obj 的值為 main.o func1.o func2.o爷耀。

特別地,如果要把所有 .o 文件放在 obj 目錄下拍皮,可用以下方法:

obj = $(patsubst ./src/%.c, ./obj/%.o, $(src))

10畏纲、小結(jié)

Makefile 其實(shí)提供了非常非常多的功能,但本文所寫(xiě)的對(duì)于一般的企業(yè)應(yīng)用完全夠用了春缕。特別對(duì)于初學(xué)者盗胀,學(xué)習(xí)一些基礎(chǔ)知識(shí)(如本文),再輔一些案例(如本系列的幾個(gè)案例)锄贼,完全可以達(dá)到企業(yè)用人標(biāo)準(zhǔn)了票灰。正所謂要抓住事物的主要矛盾,可以先把基礎(chǔ)知識(shí)吃透再去延伸 Makefile 的其它知識(shí)宅荤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屑迂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子冯键,更是在濱河造成了極大的恐慌惹盼,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惫确,死亡現(xiàn)場(chǎng)離奇詭異手报,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)改化,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)掩蛤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人陈肛,你說(shuō)我怎么就攤上這事揍鸟。” “怎么了句旱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵阳藻,是天一觀的道長(zhǎng)晰奖。 經(jīng)常有香客問(wèn)我,道長(zhǎng)腥泥,這世上最難降的妖魔是什么畅涂? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮道川,結(jié)果婚禮上午衰,老公的妹妹穿的比我還像新娘。我一直安慰自己冒萄,他們只是感情好臊岸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著尊流,像睡著了一般帅戒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崖技,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天逻住,我揣著相機(jī)與錄音,去河邊找鬼迎献。 笑死瞎访,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吁恍。 我是一名探鬼主播扒秸,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼冀瓦!你這毒婦竟也來(lái)了伴奥?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤翼闽,失蹤者是張志新(化名)和其女友劉穎拾徙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體感局,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尼啡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蓝厌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玄叠。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡古徒,死狀恐怖拓提,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隧膘,我是刑警寧澤代态,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布寺惫,位于F島的核電站,受9級(jí)特大地震影響蹦疑,放射性物質(zhì)發(fā)生泄漏西雀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一歉摧、第九天 我趴在偏房一處隱蔽的房頂上張望艇肴。 院中可真熱鬧,春花似錦叁温、人聲如沸再悼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)冲九。三九已至,卻和暖如春跟束,著一層夾襖步出監(jiān)牢的瞬間莺奸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工冀宴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灭贷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓略贮,卻偏偏與公主長(zhǎng)得像氧腰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刨肃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 來(lái)自陳浩的一片老文古拴,但絕對(duì)營(yíng)養(yǎng)。 示例工程:3 個(gè)頭文件*.h真友,和 8 個(gè) C 文件*.c黄痪。 初 編譯過(guò)程,源文件...
    周筱魯閱讀 4,696評(píng)論 0 17
  • makefile關(guān)系到整個(gè)工程的編譯規(guī)則盔然,一個(gè)工程中的源文件不計(jì)其數(shù)桅打,按其類型、功能愈案、模塊分別放在若干的目錄當(dāng)中挺尾,...
    Joe_HUST閱讀 1,880評(píng)論 0 3
  • 第一章:編譯和安裝SCons第二章:簡(jiǎn)單編譯第三章:編譯相關(guān)的一些事情第四章:編譯和鏈接庫(kù)文件第五章:節(jié)點(diǎn)對(duì)象第六...
    仙靈兒閱讀 11,799評(píng)論 0 3
  • P2 “那么在那之后呢?”電話的那頭傳來(lái)輕微的噪點(diǎn)聲站绪,方遠(yuǎn)把聲音放的很小遭铺,隔著話筒我都可以感覺(jué)到他的偷偷摸摸。 “...
    徐來(lái)之閱讀 46評(píng)論 0 0
  • 最佳學(xué)習(xí)獎(jiǎng):韓逸群 我覺(jué)得逸群學(xué)習(xí)非常好,像哈利波特里面的赫敏一樣聰明魂挂。 因?yàn)樗谄匠5膶W(xué)習(xí)中總是積極回答問(wèn)題...
    黃紅兵閱讀 237評(píng)論 0 0