前言 本文通過幾個簡單的示例,可以快速瞭解Makefile的基本使用方法,適用於編譯我們平時練習所編寫的小量代碼。 1. make命令 Makefile文件內容: all為目標,這裡沒有依賴的文件,這條命令是列印(echo)出“Hello Makefile”這行文字 all: echo "Hello ...
前言
本文通過幾個簡單的示例,可以快速瞭解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生成一個可執行文件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
當執行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之後再執行make clean又會發生什麼呢?
我們輸入touch clean產生一個空的文件,再執行make clean,觀察現象
$ touch clean
$ make clean
$ make: 'clean' is up to date.
此時make提醒clean文件是最新的,而不是執行清除操作。
要解決這個問題,我們就得引入偽目標。
偽目標
偽目標採用".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,我們會發現此時能夠正常執行清除操作。
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可以大大提升效率,且便於維護。