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