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