makefile不僅僅是乙個命令的集合體,其中有一些規則是需要理解掌握的。
首先,了解makefile的規則:
//-----------格式----------
目標 : 依賴1,依賴2
(tap鍵)命令
//-------------------------
1、目標,就是我們想生成的檔案。
2、依賴往往是我們已經有的檔案,是生成目標的必要條件。
3、命令就是利用依賴來產生目標。
命令不是任何情況都可以執行的,它是有條件的:
1、目標不存在 or 2、依賴已更新(首先依賴是存在的)。
牛刀小試:
1、編譯和鏈結放一塊了:
hello: hello.c a.c
gcc -o hello hello.c a.c
hello是目標,命令執行後會被生成。hello可通過「.\hello」執行。
gcc 可以理解為是linux中的乙個軟體,而 -o 就是軟體中的乙個按鍵(選項),hello.c a.c就是已經新增的模組檔案。
這就是命令,就像是你在windows裡開啟乙個軟體,新增檔案,然後按下編譯按鈕。命令就是這麼一回事。
2、編譯和鏈結分開:
過程分析:首先目標hello 依賴於 hello.o 和 a.o
結果這兩個依賴不存在,那麼向下找目標。
發現目標hello.o,依賴於hello.c(這個是存在的)。滿足目標不存在
那麼執行命令 gcc -o hello -c hello.c//表示編譯hello.c輸出hello.o但不鏈結。
下邊的同理。。。。。。。
現在兩個.o檔案都有了,那麼這條命令可以執行了:
gcc -o hello hello.o a.o//鏈結這兩個檔案,輸出hello可執行檔案。
這樣的好處是:
利用規則:1、目標不存在。or 2、依賴已更新(首先依賴是存在的)。
可以不編譯,沒有修改的檔案,從而節省編譯時間。
最後,還可以簡寫:
分析下:
$@ 表示的是目標(的集合);
$^ 表示的是依賴(的集合);
%.o 表示所有的.o檔案
%.c 表示所有的.c檔案
這裡提一點:
1、當我們執行make的時候,我們的目的是,引數該檔案的第乙個目標,就是hello。所以clean 下的命令並不會執行。
2、clean是乙個虛擬的目標,並沒有依賴項。我們可以通過 make clean 這個命令去執行它下邊這個命令(清楚掉所有的.o檔案)
再來看乙個複雜一點的:
第一行是什麼,意思目前我也不知道,可以把它看成是乙個函式,makefile中呼叫函式的方式就是」$( ) 」
arm-linux-gcc 就是linux的中的另乙個軟體了——交叉編譯器。
何為,交叉編譯?就是在乙個平台編譯,生成乙個可以在另乙個平台執行的檔案。
具體看看這句:
arm-linux-gcc $(cflags) -c -o crt0.o crt0.s
看著「-c -o crt0.o crt0.s」這條命令的順序,你是否感覺奇怪?
如果,你把-c -o 理解成兩個按鍵,感覺可能好很多。
之所以這麼隨意的順序,去寫,是因為這些選項往往有乙個特性,就是忽略掉後面自己不需要的檔案。
這段makefile以後還會具體分析,今天就到這裡~~
2014-11-25
宋桓公
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 變數名 值 引用變數可在之後定義 ...