Makefile學習筆記

       Makefile是做Linux方向經常用到的文件,Makefile主要用來管理代碼的編譯,代碼的編譯順序,以及在後期某個文件發生變動,就只編譯該文件,而不用所有文件都編譯一次;Makefile的編寫基本是一勞永逸的,編寫一次,後面基於該Makefile做相應的修改即可。

    Makefile文件一般可以命名爲Makefile或者makefile,在linux內核中一般是選用的前者命名的;

    Makefile如果命名爲其他名字也是可以的:比如makefile_demo,但是在make的時候需要使用如下命令:

          make  -f makefile_demo.

  Makefile的格式一般是:

   目標:依賴

         規則

目標是make之後生成文件名字,依賴是生成目標文件所需要的文件,規則是指導怎麼生成目標文件或者如何生成目標文件所需要的依賴。就好比:做一道菜:你需要知道做成一道什麼樣的菜<----->目標,做着道菜需要準備哪些蔬菜原料<------->依賴,做這道菜的過程是怎樣的<------>規則。

Makefile在編譯代碼的時候,因爲代碼一般是有很多的.c文件組成的,所以在寫Makefile的時候,放在Makefile最前面的目標是該工程的一個終極目標。而下面的目標是爲終極目標服務的,一般是爲了生成終極目標所需要的依賴。

Makefile在編譯的時候的規則是這樣的,首先檢查目標文件的依賴是否是存在的,如果依賴的文件不存在,則繼續向下找是否有對應的規則生成目標所需要的依賴。總結一下就是:在編譯的過程從第一個目標往下先找對應的依賴,然後從下向上執行對應的命令。

Makefile文件中常用的自動變量:

$@ ---------->目標;

$< ------------>依賴中文件中的第一個依賴;

$^ -------------> 表示所有的依賴

例如:app:main.c test1.c test2.c

$^表示的是main.c test1.c test2.c;$<表示是main.c $@表示的是app.

Makefile中變量在直接賦值的時候就完成了變量的定義;

引用變量的值的時候 是在用()括起來改變量,然後在()前面加一個$符號。

在Makefile中經常還會用到%這個符號,在Makefile中%是通配符,經常用在模式規則中來匹配文件,所謂的模式規則就是:

 在一個有main.c test1.c test2.c的工程裏:

  %.o:%.c

       $(CC) -c $< -o $@

這個模式規則的作用就相當於以下命令:

main.o:main.c

      gcc -c main.c -o main.o

test1.o:test1.c

      gcc -c test1.c -o test1.o

test2.test2.c

      gcc -c test2.c -o test2.o

最後說一下Makefile文件中經常使用的兩個函數,在Makefile中所有的函數都是有返回值的:

wildcard:

用於查找指定目錄下指定類型的文件,跟的參數就是目錄+文件類型,比如:

src = $(wildcard ./src/*.c)

這句話表示:找到./src 目錄下所有後綴爲.c的文件,並賦給變量src。

命令執行完成後,src的值爲:main.c func1.c fun2.c。
 

patsubst:

匹配替換,例如以下例子,用於從src目錄中找到所有.c 結尾的文件,並將其替換爲.o文件,並賦值給obj。

obj = $(patsubst %.c ,%.o ,$(src))

把src變量中所有後綴爲.c的文件替換成.o。

命令執行完成後,obj的值爲main.o func1.o func2.o

特別地,如果要把所有.o文件放在obj目錄下,可用以下方法:

ob = $(patsubst ./src/%.c, ./obj/%.o, $(src))
 

注:主要參考yychuyu博主的分享,感謝!!

 

 

 

 

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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