make與makefile入門介紹

1.什么是make

? ? 代碼變成可執(zhí)行文件, 叫做編譯(compile),先編譯這個(gè), 還是先編譯那個(gè)(即編譯的安排), 叫做構(gòu)建(build)。

? ? make是最常用的構(gòu)建工具度陆,主要用于C/C++的項(xiàng)目. gcc與g++是常用的編譯工具

2.Makefile

? ? make默認(rèn)會(huì)根據(jù)Makefile文件中的指令來構(gòu)建讥此,也可以在參數(shù)中指定makefile

? ? 指定makefile的參數(shù): -f FILE, --file=FILE, --makefile=FILE

3.make的安裝

? (1)CentOS默認(rèn)已經(jīng)帶有make

? (2)Windows可以安裝msys2

4.Makefile的編寫

? (1)Makefile文件由一系列規(guī)則(rules)構(gòu)成抵蚊。每條規(guī)則的形式如下:

? ? ?<target> : <prerequisites>

? ? ? [tab]? <commands>

? 上面第一行冒號(hào)前面的部分丹皱,叫做"目標(biāo)"(target)享郊,冒號(hào)后面的部分叫做"前置條件"(prerequisites)惧财;第二行必須由一個(gè)tab鍵起首巡扇,后面跟著"命令"(commands)。

? ? "目標(biāo)"是必需的垮衷,不可省略厅翔;"前置條件"和"命令"都是可選的,但是兩者之中必須至少存在一個(gè)搀突。

? (2)target - 目標(biāo)

? ? 一般一個(gè)目標(biāo)為一個(gè)文件刀闷,如 hello.o

? ? 除了文件名,目標(biāo)還可以是某個(gè)操作的名字描姚,這稱為"偽目標(biāo)"(phony target)

? ? 如果Make命令運(yùn)行時(shí)沒有指定目標(biāo)涩赢,默認(rèn)會(huì)執(zhí)行Makefile文件的第一個(gè)目標(biāo)

? (3)前置條件(prerequisites)

? ? 前置條件通常是一組文件名,之間用空格分隔轩勘。它指定了"目標(biāo)"是否重新構(gòu)建的判斷標(biāo)準(zhǔn):只要有一個(gè)前置文件不存在筒扒,或者有過更新(前置文件的last-modification時(shí)間戳比目標(biāo)的時(shí)間戳新),"目標(biāo)"就需要重新構(gòu)建

? (4)命令(commands)

? ? 命令(commands)表示如何更新目標(biāo)文件绊寻,由一行或多行的Shell命令組成花墩。它是構(gòu)建"目標(biāo)"的具體指令,它的運(yùn)行結(jié)果通常就是生成目標(biāo)文件澄步。

? ? 每行命令之前必須有一個(gè)tab鍵冰蘑。如果想用其他鍵,可以用內(nèi)置變量.RECIPEPREFIX聲明.

? ? 注意: 每行命令在一個(gè)單獨(dú)的shell中執(zhí)行村缸。這些Shell之間沒有繼承關(guān)系

5.Makefile的語法

? (1)# 在Makefile中表示注釋

? (2)在命令的前面加上@祠肥,就可以關(guān)閉回顯

? (3)Makefile 允許使用等號(hào)自定義變量, 可以在rules外定義,如:

? ? txt = Hello World

調(diào)用時(shí)梯皿,變量需要放在 $( )之中

? (4)內(nèi)置變量

? ? CXX: C++編譯器仇箱,默認(rèn)為g++

? (5)自動(dòng)變量

? ? $@指代當(dāng)前目標(biāo)

? ? $< 指代第一個(gè)前置條件

6.Makefile中的其他細(xì)節(jié)

? (1)makefile中的加號(hào)+县恕,減號(hào)-和at號(hào)@的含義

? ? @ 使命令在被執(zhí)行前不被回顯

? ? -? 使任何命令行的任何非零退出狀態(tài)都被忽略。

7.示例的Makefile

? (1)hello.cpp

?#include<stdio.h>

int main()

{

? ? printf("hello world\n");

? ? return 0;

}


? (2)Makefile for hello.cpp

all:hello.exe hello2.exe # makefile默認(rèn)僅執(zhí)行第1個(gè)rule,因此將第1個(gè)rule設(shè)置為所有的輸出

hello.o : hello.cpp # hello.cpp是hello.o的前提

@echo building $@, the prerequisites is $<

g++ -c hello.cpp -o hello.o

hello.exe : hello.o # hello.o是hello.exe的前提

@echo building $@, the prerequisites is $<

g++ hello.o -o hello.exe

hello2.exe : hello.cpp # 從hello.cpp直接編譯出exe

@echo building $@, the prerequisites is $<

g++ hello.cpp -o hello2.exe

clean :

-rm hello.o

-rm hello.exe

-rm hello2.exe

install :

-@test -d bin || mkdir bin

cp -frv hello.exe bin/hello.exe

cp -frv hello2.exe bin/hello2.exe

.PHONY: clean all install

# 偽目標(biāo),聲明clean是"偽目標(biāo)"之后剂桥,make就不會(huì)去檢查是否存在一個(gè)叫做clean的文件忠烛,而是每次運(yùn)行都執(zhí)行對(duì)應(yīng)的命令




9.參考

(1)阮一峰的Make命令教程:https://www.ruanyifeng.com/blog/2015/02/make.html

? (2)make官方文檔: https://www.gnu.org/software/make/manual/make.html

(3)makefile中的加號(hào)+,減號(hào)-和at號(hào)@的含義:https://www.cnblogs.com/leaven/p/4337628.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末权逗,一起剝皮案震驚了整個(gè)濱河市美尸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斟薇,老刑警劉巖师坎,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異奔垦,居然都是意外死亡屹耐,警方通過查閱死者的電腦和手機(jī)尸疆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門椿猎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寿弱,你說我怎么就攤上這事犯眠。” “怎么了症革?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵筐咧,是天一觀的道長。 經(jīng)常有香客問我噪矛,道長量蕊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任艇挨,我火速辦了婚禮残炮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缩滨。我一直安慰自己势就,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布脉漏。 她就那樣靜靜地躺著苞冯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪侧巨。 梳的紋絲不亂的頭發(fā)上舅锄,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音司忱,去河邊找鬼皇忿。 笑死碉怔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的禁添。 我是一名探鬼主播撮胧,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼老翘!你這毒婦竟也來了芹啥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤铺峭,失蹤者是張志新(化名)和其女友劉穎墓怀,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卫键,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡傀履,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了莉炉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钓账。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖絮宁,靈堂內(nèi)的尸體忽然破棺而出梆暮,到底是詐尸還是另有隱情,我是刑警寧澤绍昂,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布啦粹,位于F島的核電站,受9級(jí)特大地震影響窘游,放射性物質(zhì)發(fā)生泄漏唠椭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一忍饰、第九天 我趴在偏房一處隱蔽的房頂上張望贪嫂。 院中可真熱鬧,春花似錦喘批、人聲如沸撩荣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽餐曹。三九已至,卻和暖如春敌厘,著一層夾襖步出監(jiān)牢的瞬間台猴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工旗闽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留来庭,地道東北人军拟。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓轴术,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耐齐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子另锋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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

  • 很久以前寫的一篇技術(shù)備忘了待德,隱約記得當(dāng)時(shí)是看了APUE 2nd Edition這本書后俊柔,下載的源碼在CentOS7...
    黃瓜苗苗的兜大寶閱讀 1,343評(píng)論 0 0
  • makefile 介紹 make命令執(zhí)行時(shí)筹麸,需要一個(gè) makefile 文件,以告訴make命令如何去編譯和鏈接程...
    Stan_Z閱讀 1,624評(píng)論 2 15
  • Introduction GNU is an operating system and an extensive ...
    SharlotteZZZ閱讀 261評(píng)論 0 0
  • Makefile 筆記 一雏婶、簡單的 Makefile 例子 文檔目錄結(jié)構(gòu)文檔目錄結(jié)構(gòu)是用戶目錄HOME下有src ...
    csranger閱讀 107評(píng)論 0 0
  • 本節(jié)內(nèi)容將向大家介紹 qmake 的一些基礎(chǔ)知識(shí)物赶。本手冊(cè)中的其他主題將包含有關(guān)使用 qmake 的更詳細(xì)內(nèi)容。 簡...
    趙者也閱讀 354評(píng)論 0 1