Makefile帶來直接好處就是——“自動化編譯”。一旦寫好,只需要一個make命令,整個工程完全自動編譯,所以十分方便。而Makefile文件就是告訴make命令怎么樣地去編譯和鏈接程序。但是想要比較靈活的運(yùn)用它,還是先要熟悉一些關(guān)于系統(tǒng)對程序編譯和鏈接的知識。
1.一個簡單的makefile例子
假設(shè)一個程序有兩個文件file1.c,file2.c,每個文件都包含head.h,生成file可執(zhí)行文件
file:file1.o file2.o 附屬行(文件的依存關(guān)系)
gcc -o file1.o file2.o 命令行
file1.o:file1.c head.h
gcc -c file1.c
file2.o:file2.c head.h
gcc -c file2.c
從file最終的目標(biāo)文件開始倒推,依次列出文件的依存關(guān)系,make在執(zhí)行時:
(1)判斷file可執(zhí)行文件是否存在,若不存在,則執(zhí)行命令行,向下尋找依存關(guān)系
(2)若file存在,則檢查依靠文件,是否存在更新,若存在更新則執(zhí)行命令行,若沒有更新則給出提示:
make:'file' is up to date.
2.makefile中的宏定義及內(nèi)部變量
宏定義:
OBJS = file1.o file2.o
CC = gcc
CFLAGS = -wall -O -g
引用:
file:$(OBJS)
$(CC) $(OBJS) -o file
file1.o:file1.c head.h
$(CC) $(FLAGS) -c file1.c
file2.o:file2.c head.h
$(CC) $(FLAGS) -c file2.c
內(nèi)部變量:
$^ 代表所有的依賴文件
$@ 代表所有的目標(biāo)文件
$< 代表第一個依賴文件
file:$(OBJS)
$(CC) $^ -o $@
file1.o:file1.c head.h
$(CC) $(FLAGS) -c $< -o $@
file2.o:file2.c head.h
$(CC) $(FLAGS) -c $< -o $@
"(CC) **(FLAGS) -c **< -o @"是隱含規(guī)則,可以不寫,默認(rèn)使用此規(guī)則ww
3.假象
假設(shè)一個項(xiàng)目要生成兩個可執(zhí)行文件file1和file2,這兩個文件是獨(dú)立的,則在makefile開始處:
all:file1 file2
make總是假設(shè)all要生成,去檢查它的依賴文件
4.清除由make產(chǎn)生的文件
clean:
rm *.o
rm file
執(zhí)行:
make clean
則會清除由make生成的*.o和file文件
如果有clean文件存在,則清除不會執(zhí)行(因clean沒有可依賴的文件,永遠(yuǎn)是最新的)
使用PHONY目標(biāo),避免同名文件相沖突,不會檢查clean文件存在與否,都要執(zhí)行清除操作
.PHONY : clean
clean:
rm *.o
rm file
5.makefile函數(shù)
搜索當(dāng)前目錄,生成由*.c結(jié)尾的文件列表,wildcard--函數(shù)名
SOURCE = $(wildcard *.c)
用%.o替換$(SOURCE)中的%.c文件
OBJS = $(patsubst %.c,%.o,$(SOURCE))
6.產(chǎn)生新規(guī)則
SOURCE = $(wildcard *.c)
depends:$(SOURCE)
gcc -M $(SOURCE) > depends
(為每一個.c文件產(chǎn)生規(guī)則,c文件和相關(guān)頭文件為依靠)
在makefile文件中:
include depends
7.一個有效的makefile文件
可以完成大部分我們所需要的依靠檢查,不用做太多的修改就可用在大多數(shù)項(xiàng)目里
功能:搜索當(dāng)前目錄,尋找源碼文件,放入SOURCE變量里,利用patsubst產(chǎn)生目標(biāo)文件(*.o)
CC = gcc
CFLAGS = -Wall -O -g
SOURCE = $(wildcard *.c,*.cc)
OBJS = $(patsubst %.c,%.o,$(patsubst,%.cc,%.o,$(SOURCE)))
file:$(OBJS)
$(CC) $^ -o $@
用默認(rèn)規(guī)則產(chǎn)生目標(biāo)文件(*.o)
(缺點(diǎn):并未包含頭文件,當(dāng)頭文件更新時,不能重新編譯)
-
文件
+關(guān)注
關(guān)注
1文章
566瀏覽量
24749 -
程序
+關(guān)注
關(guān)注
117文章
3787瀏覽量
81060 -
命令
+關(guān)注
關(guān)注
5文章
684瀏覽量
22027 -
編譯
+關(guān)注
關(guān)注
0文章
657瀏覽量
32873 -
Makefile
+關(guān)注
關(guān)注
1文章
125瀏覽量
19185
發(fā)布評論請先 登錄
相關(guān)推薦
評論