makefile

一、概述

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無法執行。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章