一、概述
1、make:是一個非常重要的編譯命令,本質上它是一個程序。利用make工具,可以將大型的開發項目分解成爲多個更易於管理的模塊,對於一個包括幾百個源文件的應用程序,使用make和makefile工具就可以簡潔明快地理順各個源文件之間紛繁複雜的相互關係。而且如此多的源文件,如果每次都要鍵入gcc命令進行編譯的話,那對程序員來說簡直就是一場災難。而make工具則可自動完成編譯工作,並且可以只對程序員在上次編譯後修改過的部分進行編譯。
2、Makefile文件 :Make工具最主要也是最基本的功能就是通過makefile文件來描述源程序之間的相互關係並自動維護編譯工作,本質上makefile文件是個文本文件,用於配置編譯過程。makefile 文件需要按照某種語法進行編寫,文件中需要說明如何編譯各個源文件並連接生成可執行文件,並要求定義源文件之間的依賴關係。makefile 文件是許多編譯器--包括 Windows NT 下的編譯器--維護編譯信息的常用方法,只是在集成開發環境中,用戶通過友好的界面修改 makefile 文件而已。
3、在UNIX系統中,習慣使用 Makefile 作爲 makfile 文件。
二、makefile中的規則
gcc a.c b.c c.c -o app
三部分:目標,依賴,命令
目標:依賴
(tab縮進)命令
app:a.c b.c c.c
gcc a.c b.c c.c -o app
三、makefile中的變量
自定義變量:
obj=a.o b.o c.o
obj=10
變量的取值:
aa=$(obj)
makefile自帶的變量:大寫(有些自帶變量已賦值,有的則沒賦值,故最好自行賦值)
CPPFLAGS
CC
自動變量:
$@:表示規則中的目標
$<:表示規則中的第一個依賴 例如,app:main.o add.o sub.o mul.o中的main.o
$^:表示規則中的所有依賴 例如,app:main.o add.o sub.o mul.o中的main.o add.o sub.o mul.o
注意:只能在規則的命令中使用
四、簡易版本
src = $(wildcard ./*.c)
obj = $(patsubst %.c,%.o,$(src))
target = app
$(target):$(obj)
gcc $^ -o $@
%.o:%.c
gcc -c $< -o $@
.PHONY:clean
-rm $(obj) $(target) -f
makefile所有函數都有返回值
查找指定目錄下的指定類型的文件
src=$(wildcard ./*.c)----查找當前目錄下的所有.c文件,並賦值給src
匹配替換:(在$(patsubst %.c,%.o,$(dir) )中,patsubst把$(dir)中的變量符合後綴是.c的全部替換成.o)
obj=$(patsubst %.c,%.o,$(src))
聲明僞目標:
.PHONY:clean
目的是爲了避免當前目錄下有一個同名的clean文件,而不能執行make clean。根據makefile第二個版本中的說法,當前目錄下有名爲clean的文件,即依賴存在,所以判斷是否需要更新,右因爲目標:依賴中只有目標而沒有依賴,所以目標的最新修改時間>依賴的最新修改時間,故不更新,導致make clean無法執行。