本文重在記錄makefile的使用方法旺聚,不介紹相關原理乡数。
注意:所有的makefile指令前面都需要兩個 tab 縮進
1.初步使用
創(chuàng)建工作目錄色洞,工作目錄下創(chuàng)建如下兩個文件:
main.c
#include <stdio.h>
int main()
{
printf("打印\n");
}
makefile 或 Makefile
app : main.o
cc -o app main.o
main.o : main.c
cc -c main.c
clean :
rm app main.o
說明:
app : mian.o
一種依賴關系的聲明贞言,生成程序app需要依賴 main.o 文件。
cc -o app main.o
一個終端命令糕篇, 執(zhí)行該命令啄育,gcc使用main.o文件生成app
main.o : main.c
同理,依賴關系聲明拌消,生成main.o需要main.c文件
cc -c main.c
使用gcc編譯main.c文件挑豌,生成二進制文件main.o
clean :
清除命令,不依賴任何文件
rm app main.o
清除編譯鏈接生成的所有文件墩崩,類似于xcode的command+shift+k
執(zhí)行流程
$ make
在工作目錄下執(zhí)行make命令氓英,make命令會按照makefile文件中的規(guī)則執(zhí)行,首先是app:main.o,依賴關系聲明生成app需要main.o文件鹦筹,make命令檢查main.o是否存在(是否最新)
- 如果存在(或最新)铝阐,則執(zhí)行表達式 cc -o app mian.c命令,生成app盛龄;
- 如果不存在(或不是最新)饰迹,則去生成main.o
main.o生成,檢查依賴余舶,main.c是否存在(或最新)
- 如果存在(或最新)啊鸭,則執(zhí)行表達式 cc -c mian.c命令,生成mian.o匿值;
- 如果不存在赠制,則報錯
以上所有的命令都可以單獨執(zhí)行,如:
$ make main.o
$ make clean
2.簡化使用
創(chuàng)建工作目錄挟憔,包含如下文件:
- main.c
- person.c
- a.h
- b.h
1.文件內容钟些,main.c同上,其他空文件即可绊谭。
創(chuàng)建makefile
app : main.o person.o other.o
cc -o app main.o person.o other.o
main.o : main.c
cc -c main.c a.h
person.o : person.c a.h b.h
cc -c person.c
other.o : person.c b.h
cc -c person.c -o other.o
clean :
rm app main.o person.o other.o
2.定義變量政恍,代替目標文件,簡化代碼达传,如下:
objects = main.o person.o other.o
app : $(objects)
cc -o app $(objects)
main.o : main.c
cc -c main.c a.h
person.o : person.c a.h b.h
cc -c person.c
other.o : person.c b.h
cc -c person.c -o other.o
clean :
rm app $(objects)
3.使用makefile的自動推導機制篙耗,簡化指令語句:
因為在編譯過程中,哪些類型文件的編譯需要哪些指令是固定的宪赶,所以makefile可以從依賴關系自動推導出后面要執(zhí)行的語句
簡化如下:
objects = main.o person.o
app : $(objects)
cc -o app $(objects)
main.o : main.c
person.o : person.c a.h b.h
clean :
rm app $(objects)
只有依賴聲明下面沒有任何語句宗弯,makefile才會自動推導,否則執(zhí)行指定語句
注意:這里去掉了other.o,是因為搂妻,前面other.o依賴person.c 手動指定生成other.o蒙保,這里makefile只會生成和依賴文件相同名字的 .o 文件。
4.如果我們的文件不在一個目錄欲主,需要指定目錄邓厕,只需要在makefile文件中第一行添加
VPATH = path1:path2:path3
makefile會自行按照路徑順序逝嚎,依次查找文件。
5.最終版
VPATH = ./subfile:./otherPath
#這是一個注釋
CC = gcc #設置編譯器
objects = main.o person.o
app : $(objects)
$(CC) -o app $(objects) #使用設定的編譯器編譯
@echo "輸出信息:編譯完成"
main.o : main.c
person.o : person.c a.h b.h
.PHONY : clean #說明虛擬標號邑狸,表示clean不出現(xiàn)在依賴樹中
clean :
rm app $(objects)
參考資料
makefile書寫入門
比較全面的資料
makefile-1
makefile-2
makefile-3
makefile-4
makefile-5
makefile-6