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

浙公網安備 33010602011771號