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博主的分享,感謝!!