輕松玩轉(zhuǎn)Makefile | 基礎(chǔ)用法

前言

本文通過幾個(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ù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容