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檔案中常用的自動變數:
$@ ---------->目標;
$< ------------>依賴中檔案中的第乙個依賴;
$^ -------------> 表示所有的依賴
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))
makefile學習筆記 makefile概述
20180411 makefile學習筆記 makefile概述 makefile主要是在unix下軟體編譯時寫的,window下一般不用 unix裡makefile做的事 相當於window裡ide所做的事 會不會寫makefile,從乙個側面說明了乙個人是否具備完成大型工程的能力。makefil...
Makefile學習筆記
makefile for boot asm nasm 定義變數 asmflags i include run qemu system i386 hdd boot.img boot.img boot.asm asm boot.asm f bin o boot.img install run clean...
Makefile學習筆記
本文為學習筆記,僅供參考,如有好的建議歡迎指出!makefile規則 目標檔案 依賴檔案 tab 命令 命令前必須有乙個tab exp test main.c gcc main.c o test 隱式規則 o c 同名匹配 變數 類似於c中的巨集,引用方式 arg 變數名 值 引用變數可在之後定義 ...