嵌入式Linux學習歷程 Makefile

2021-10-08 18:47:10 字數 3233 閱讀 8058

makefile用來完成以下功能:

1、 如果工程沒有編譯過,那麼工程中的所有.c檔案都要被編譯並且鏈結成可執行檔案。

2、 如果工程中只有個別c檔案被修改了,那麼只編譯這些被修改的c檔案。

3、 如果工程的標頭檔案被修改了,那麼需要編譯所有引用這個標頭檔案的c檔案,並且鏈結成可執行檔案。

例: 乙個工程:通過鍵盤輸入兩個整型數字,然後計算他們的和並將結果顯示在螢幕上,工程中包括main.c(主體)、input.c(接收鍵盤輸入的數值)和calcu.c(進行加法運算)三個c檔案及input.h、calcu.h兩個標頭檔案。

一般編譯即:

gcc main.c input.c calcu.c -o main
使用makefile編譯:

首先在工程目錄下建立「makefile」檔案檔名一定是 makefile

在makefile檔案中輸入如下**:

行首空出來的地方一定要使用「tab」鍵

編寫完成後,使用命令「make」編譯

makefile規則格式:

目標...:依賴檔案集合....

命令1命令2

......

例如以下規則:

main : main.o input.o calcu.o

gcc -o main main.o input.o calcu.o

這條規則的目標是main,*.o檔案是生成main的依賴檔案,如果要更新目標main,就必須先更新它的所有依賴檔案。如果依賴檔案中有任何乙個有更新,那麼目標也必須更新。「更新」就是執行一遍規則中的命令列表

上述**共有5條規則,1-2為第一條規則,3-4為第二條規則,5-6為第三條規則,7-8為第四條規則,10-12為第五條規則。

make命令在執行makefile的時候,執行步驟如下:

make命令的執行過程:

make 命令會在當前目錄下查詢以makefile命名的檔案

當找到makefile檔案後,會按照makefile中定義的規則去編譯生成最終的目標檔案

當發現目標檔案不存在,或者目標所依賴的檔案比目標檔案新(即最後修改時間比目標檔案晚)時,就會執行後面的命令來更新檔案。

注釋:注釋開頭要使用符號「#」

變數

定義乙個變數object,並且對這個變數進行賦值,其值為字串「main.o input.o caclu.o」

變數引用的方法是「$ (變數名)」,本例中"$ (object)"就是使用變數object

賦值符「=」

使用「=」給變數賦值,變數的真實值取決於它所引用的最後一次變數

例:

name = satr0

curname = $(name)

name = star1

print:

@echo curname: $(curname)

最終:curname = name = star1 且 輸出 star1

賦值符「:=」

使用「:=」給變數賦值,只能使用前面已經定義好的變數,不會使用後面定義的變數

例:

name = satr0

curname := $(name)

name = star1

print:

@echo curname: $(curname)

最終:curname star0,name = star1 且 輸出 star0

賦值符「?=」

使用「?=」,如果變數之前沒有被賦值,則使用當前值,如果已經被賦值,則使用之前的賦值

例: 

curname ?= star1

如果curname前面沒有被賦值,則此變數就是「star1」

如果前面已經賦過值了,那麼就使用前面賦的值

變數追加「+=」

使用「+=」,可以給已經定義好的變數新增一些字串進去

例:

object = main.o input.o

object += caclu.o

最終:object = main.o input.o calcu.o

這就是變數的追加

模式規則中,至少在規則的目標定義中要包含「%」,否則就是一般規則。目標中的「%」表示對檔名的匹配,「%」代表長度任意的非空字串,比如「%.c」就是所有以.c結尾的檔案,「a.%.c」就表示以a.開頭,以.c結尾的檔案。

當「%」出現在目標中時,目標中的「%」所代表的值決定了依賴中的「%」的值:

%.o: %.c

命令

此時,5-6行替代了此前的3-8行,第6行命令需要借助自動化變數自動化變數會把模式中所定義的一系列檔案自動的挨個取出,直至所有的符合模式的檔案都取完。自動化變數只應該出現在規則的命令中。

這7個自動化變數中,常用的為:$ @、$

偽目標不代表真正的目標名,在執行make命令時,通過指定這個偽目標來執行所在規則定義的命令 (用於避免檔案間的名字衝突

使用方法:

.phony:規則名

例:.phony:clean

宣告clean偽目標後,不管當前目錄下是否存在名為「clean」的檔案,輸入「make clean」後規則對應的rm命令都會執行。

嵌入式Linux學習歷程 BSP工程管理

bsp工程管理的目的就是為了模組化整理 同乙個屬性的檔案存放在同乙個目錄裡面。新建所需的資料夾,將同一屬性的檔案放到相應的資料夾中。修改clk led delay驅動,建立對應的驅動檔案,然後放置到對應的目錄中。根據編寫的新驅動檔案,修改main.c檔案內容。設定vscode標頭檔案路徑 先建立.v...

學習嵌入式軟體的歷程

要說我的嵌入式歷程,還要從去年 11月份開始,因為在研究生開了一門接 術課程,再加上本科學習了 51系列微控制器的基本原理,所以想找乙份這方面的兼職歷練自己。到了週末,我就跑人才招聘會投簡歷去。由於工作經驗的匱乏,很少合適的崗位選擇。跑了幾次,得到了乙個面試,應聘微控制器硬體方面的吧,人家問我,懂不...

嵌入式開發學習歷程(二) Linux環境搭建

sshd伺服器 ssh 協議 安全外殼協議。為 secure shell 的縮寫。ssh 為建立在應用層和傳輸層基礎上的安全協議。作用 sshd服務使用ssh協議可以用來進行遠端控制,或在計算機之間傳送檔案,相比較之前用telnet方式來傳輸檔案要安全很多,因為telnet使用明文傳輸,ssh是加密...