arm學習 makefile學習總結

2022-03-04 18:13:25 字數 2141 閱讀 9047

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 變數名 值 引用變數可在之後定義 ...