前言
本文通過幾個(gè)簡單的示例,可以快速了解Makefile的基本使用方法,適用于編譯我們平時(shí)練習(xí)所編寫的小量代碼。
1. make命令
Makefile文件內(nèi)容: all為<font color='green'>目標(biāo)</font>,這里沒有<font color='green'>依賴</font>的文件,這條<font color='green'>命令</font>是打印(echo)出“Hello Makefile”這行文字
all:
echo "Hello Makefile"
運(yùn)行make后,終端打印的內(nèi)容
$ make
echo "Hello Makefile"
Hello Makefile
可以看到,Makefile的命令也打印在了終端,要想不輸出命令的內(nèi)容,可以在命令前面加上@
make可以指定要生成的目標(biāo),如果不指定,則默認(rèn)第一個(gè)目標(biāo),我們將Makefile文件內(nèi)容修改一下
all:
@echo "Hello Makefile"
test:
@echo "Hello Test"
運(yùn)行不同的命令,可以看到不同的打印信息
$ make
Hello Makefile
$ make all
Hello Makefile
$ make test
Hello Test
2. 生成文件
假設(shè)現(xiàn)在有兩個(gè)文件fun.c和main.c,需要利用Makefile生成一個(gè)可執(zhí)行文件app。
fun.c的內(nèi)容
#include <stdio.h>
void fun()
{
printf("This is fun()!\n");
}
main.c的內(nèi)容
extern void fun();
int main()
{
fun();
return 0;
}
Makefile的內(nèi)容
all: main.o fun.o
gcc -o app main.o fun.o
main.o : main.c
gcc -o main.o -c main.c
fun.o : fun.c
gcc -o fun.o -c fun.c
clean:
rm app main.o fun.o
當(dāng)執(zhí)行make命令后,終端會(huì)打印下列內(nèi)容,并生成對(duì)應(yīng)的app , main.o ,fun.o文件
gcc -o main.o -c main.c
gcc -o fun.o -c fun.c
gcc -o app main.o fun.o
3. 清除文件
依舊是上面的Makefile和源文件,我們輸入make clean,就可以清除剛剛生成的3個(gè)文件。打印信息如下:
$ make clean
rm app main.o fun.o
假如Makfile目錄中,有名為clean文件,make之后再執(zhí)行make clean又會(huì)發(fā)生什么呢?
我們輸入touch clean產(chǎn)生一個(gè)空的文件,再執(zhí)行make clean,觀察現(xiàn)象
$ touch clean
$ make clean
$ make: 'clean' is up to date.
此時(shí)make提醒clean文件是最新的,而不是執(zhí)行清除操作。
要解決這個(gè)問題,我們就得引入偽目標(biāo)。
偽目標(biāo)
偽目標(biāo)采用".PHONY" 關(guān)鍵字來定義, 且必須是大寫字母。修改一下上面的Makefile
.PHONY:clean
all: main.o fun.o
gcc -o app main.o fun.o
main.o : main.c
gcc -o main.o -c main.c
fun.o : fun.c
gcc -o fun.o -c fun.c
clean:
rm app main.o fun.o
輸入make clean,我們會(huì)發(fā)現(xiàn)此時(shí)能夠正常執(zhí)行清除操作。
makefile內(nèi)容的注釋
在Makefile文件中,有些內(nèi)容我們需要寫一下備注,或者暫時(shí)不需要了,想注釋掉,需要怎么操作呢。很簡單,只需要在需要注釋的那行前面加上#號(hào)即可,像下面這樣
#這是的Makefile的注釋
#all: main.o fun.o
.PHONY:clean
all: main.o fun.o
gcc -o app main.o fun.o
main.o : main.c
gcc -o main.o -c main.c
fun.o : fun.c
gcc -o fun.o -c fun.c
clean:
rm app main.o fun.o
本文所介紹的Makefile,應(yīng)付幾個(gè)文件的編譯還可以,在實(shí)際的工程中,會(huì)有幾十個(gè)、上百個(gè)文件。要是都一個(gè)個(gè)這樣按文件名書寫,效率太低,且不好維護(hù)。后面的文章,我將會(huì)介紹Makefile的變量和函數(shù),利用它們,我們的Makefile可以大大提升效率,且便于維護(hù)。