前言
Linux 系列距離上一篇文章已經(jīng)半年多了,因?yàn)楦鞣N事情一直耽擱到現(xiàn)在,很多小伙伴都問了好些次,一直在等著,感謝大家支持!確實(shí)時(shí)間拖得太久了,是時(shí)候重新加油起來!
簡單理了理思路,通過一篇簡單點(diǎn)的文章過度一下,上一篇講到了 Linux 下的 C 編程,本文就要引出 Make 以及 Makefile 了。
嵌入式 Linux 入門系列博文:
嵌入式 Linux 入門(一、Linux 基本介紹及文件結(jié)構(gòu))
嵌入式 Linux 入門(二、Linux 文件系統(tǒng)、文件類型及權(quán)限管理
嵌入式 Linux 入門(三、Linux Shell 及常用命令說明)
嵌入式 Linux 入門(四、Linux 下的編輯器 — 讓人愛恨交加的 vi )
嵌入式 Linux 入門(五、Shell 腳本編程上:認(rèn)識(shí) Shell 腳本)
嵌入式 Linux 入門(六、Shell 腳本編程下:Shell 腳本語法)
嵌入式 Linux 入門(七、Linux 下的環(huán)境變量)
嵌入式 Linux 入門 環(huán)境篇系列博文:
嵌入式 Linux 入門 環(huán)境篇(一、開發(fā)板初體驗(yàn))
嵌入式 Linux 入門 環(huán)境篇(二、安裝虛擬機(jī) — 體驗(yàn) Ubuntu 22.04)
嵌入式 Linux 入門 環(huán)境篇(三、開發(fā)板和 PC 的網(wǎng)絡(luò)互通)
嵌入式 Linux 入門 環(huán)境篇(四、必備開發(fā)工具安裝)
嵌入式 Linux 入門 環(huán)境篇(五、NFS 文件共享)
嵌入式 Linux 入門 環(huán)境篇(六、搭建 TFTP 環(huán)境)
我是矜辰所致,全網(wǎng)同名,盡量用心寫好每一系列文章,不浮夸,不將就,認(rèn)真對(duì)待學(xué)知識(shí)的我們,矜辰所致,金石為開!
一、Linux 下多文件編譯
在上一篇 Linux 下的 C 編程我們知道了 Linux 下的編譯器為 GCC ,以及如何使用 GCC 進(jìn)行編譯,在文章我們講解 GCC 的編譯,使用的只使用了一個(gè) .c 文件,直接使用
gcc [目標(biāo)文件] -o [想要生產(chǎn)的文件名字]
那在遇到多個(gè) .c 文件的時(shí)候如何處理呢?
實(shí)際上還是使用上面這條指令,其中的 [目標(biāo)文件]
是可以為多個(gè)的。
舉一個(gè)簡單的例子,我們寫了三個(gè).c 文件,內(nèi)容如下:
編譯的方式如下圖:
這么看起來是不是感覺還算簡單?但是我們可以試想一下,以后做項(xiàng)目的時(shí)候,成千上萬個(gè)文件,怎么辦?
我們要考慮2個(gè)主要問題:
1、 文件數(shù)量多起來了以后如何處理?
2、只修改了單個(gè)文件,如何只重新編譯修改過后的單個(gè)文件?
我們不可能和上面示例一樣手動(dòng)使用 gcc 命令輸入文件名的,而且文件多起來了,編譯時(shí)間需要很長,使用上面示例的命令,是會(huì)把所有的文件都重新編譯,在后面的 linux 學(xué)習(xí)開發(fā)中,項(xiàng)目的編譯時(shí)間可比學(xué)習(xí) 51 、STM32 哪些工程的時(shí)候多得太多,每次都編譯所有文件這種行為肯定是不可取的。
在 Windows 下面我們有各種集成的 IDE 工具,往往只需要一個(gè)按鈕,就可以編譯整個(gè)工程,方便快捷,比如我們熟悉的 Keil,我們只需要點(diǎn)擊 IDE 工具欄目的一個(gè)按鈕,就可以完成我們想要的操作:
那么在 Linux 下,我們?cè)撊绾翁幚砟兀?/p>
這就要用到本文主要說明的東西:Make 工具 和 Makefile 。
二、make 工具和 Makefile
首先我們要知道什么是 Make 工具,以及 什么 是 Makefile。
這部分的內(nèi)容時(shí)基本概念,類似名詞解釋,大家記住就好,沒有什么特別需要說明的,因?yàn)槲覀兊闹攸c(diǎn)在于知道以及學(xué)會(huì)他們的使用.
2.1 make 和 Makefile 是什么?
make 工具:
make 本質(zhì)上它是一個(gè)程序,是一個(gè)編譯工具。我們?cè)诤竺孢M(jìn)行程序的時(shí)候,都需要使用 make 命令。
使用 make 工具我們可以自動(dòng)完成編譯工作,而且可以有效的處理我們上面提到的問題:
- 多個(gè)文件的自動(dòng)編譯;
- 每次執(zhí)行 make 命令,只重新編譯修改后的文件;. 這里提一句,Linux 是如何判斷文件是否有修改:文件的修改時(shí)間!就是通過
ls -l
查看的那個(gè)時(shí)間,make 會(huì)根據(jù)依賴關(guān)系,如果發(fā)現(xiàn)依賴的文件修改時(shí)間比自己新,那么久會(huì)重新編譯一下這個(gè)依賴文件)
利用 make 工具可以將大型的開發(fā)項(xiàng)目分解成為多個(gè)更易于管理的模塊,可以簡潔明快地理順各個(gè)源文件之間紛繁復(fù)雜的相互關(guān)系,大大簡化開發(fā)工作,避免不必要的重新編譯 。
make工具通過一個(gè)稱為 Makefile 的文件來完成并自動(dòng)維護(hù)編譯工作,Makefile文件描述了整個(gè)工程的編譯、連接規(guī)則。
Makefile 文件:
Makefile 是一個(gè)文件,是一個(gè)描述一系列規(guī)則的文件。
Makefile 的 開頭 M 要大寫?。m然有的地方說大小寫都可以,但是保證大寫,是肯定不會(huì)有莫名其妙的問題的)。
make 會(huì)根據(jù) Makefile 文件的規(guī)則規(guī)則執(zhí)行命令,最后完成編譯輸出 。
在 Makefile 文件中:
- 定義一系列的規(guī)則來制定源文件編譯后的先后順序
- 特定的語法規(guī)則、支持函數(shù)定義、函數(shù)調(diào)用
- 能直接集成操作系統(tǒng)中的命令
這是我們學(xué)習(xí) Linux 的一個(gè)重點(diǎn)對(duì)象,對(duì)于新手來說,至少要做到能夠看得懂,會(huì)一定程度的修改 Makefile 。
2.2 通過 STM32 提前熟悉 Makefile
實(shí)際上 STM32 的開發(fā),我們也可以用到 Make 工具和 Makefile,如果大家目前也在用 STM32 開發(fā),不妨使用 GCC 工具鏈開發(fā),這樣也能提前熟悉 Makefile 。
如果是我的粉絲朋友,一定知道現(xiàn)在我做 STM32 都是使用的 gcc 工具鏈,具體可查看文章:
拋棄IDE — 在window下使用VScode搭建ARM開發(fā)環(huán)境
如果想看看簡單的 Makefile ,大家可以寫一個(gè)簡單的 STM32 工程,然后在 STM32CubeMX 生成工程的時(shí)候選擇 Makefile ,如下圖:
然后打開工程,就可以看看 ST 工具自動(dòng)生成的 Makefile 文件了,可以讓自己提前熟悉熟悉 Makefile:
2.3 GCC 與 make 的關(guān)系/區(qū)別?
經(jīng)常有小伙伴會(huì)被 GCC 與 make 工具搞得糊里糊涂,雖然知道怎么用,但是傻傻分不清楚或者是說不明白。
看清楚概念:GCC 是編譯器,make 是一個(gè)命令工具。
感覺把概念一說就清楚了啊, GCC 是一個(gè)編譯 C語言的編譯器, 而 make 是一個(gè)工具,他可以使得編譯工作簡化,只不過我們使用的時(shí)候 make 會(huì)調(diào)用 GCC 編譯器去完成編譯工作。
在 Makefile 中我們會(huì)指定執(zhí)行編譯的編譯器類型,而且會(huì)根據(jù)指定的編譯器類型進(jìn)行對(duì)應(yīng)的命令操作,如下圖:
因?yàn)槲覀冊(cè)?linux 下使用的都是 gcc 編譯器,所以 Makefile 中的會(huì)看到我們熟悉的 gcc 的操作命令,我們只不過是利用 make 工具的自動(dòng)編譯去調(diào)用了 gcc 編譯器 對(duì)工程進(jìn)行編譯。
三、一個(gè)簡單的 Makefile
上面說過,Makefile 是學(xué)習(xí) Linux 的一個(gè)要點(diǎn)之一,對(duì)于 Makefile 說明,我會(huì)單獨(dú)分專欄進(jìn)行說明介紹,那本文我們剛剛接觸,我們寫一個(gè)簡單的 Makefile 來編譯文章開頭我們示例的3個(gè)文件。
直接先寫一個(gè)傻瓜式的,看看 make 工具是否有用,在示例 .c 文件同目錄下,我們新建一個(gè) Makefile 文件,如下:
然后試著使用 make 命令看看效果:
OK,果然可以 make 直接編譯,但是上面這個(gè) Makefile 是有問題的,因?yàn)槊看螆?zhí)行 make ,會(huì)把所有的 .c 文件都重新編譯器一次,實(shí)際使用也不可能這么寫。
我們回憶一下上一篇課程的內(nèi)容,一個(gè)C 文件要經(jīng)過預(yù)處理、編譯、匯編 和 鏈接才能變成可執(zhí)行文件,由不同的 .c
文件生成到不同的 .o
文件,最終才將所有的 .o
文件鏈接成可執(zhí)行文件。
所以我們可分開進(jìn)行,把每一個(gè) .c
先生成 .o
文件,然后再由 所有的 .o
文件生成 最終的文件,這樣如果單獨(dú)修改了某個(gè)文件 ,只需要把修改過的 .c
文件重新編譯就行了,所以我們的 Makefile 應(yīng)該這么寫:
make 的結(jié)果如下:
這樣寫得好處就是,如果我們只對(duì)某一個(gè).c
文件進(jìn)行修改,他只會(huì)對(duì)修改過的文件進(jìn)行重新編譯,我們可以測試一下,比如我們修改一下 a.c
文件:
上面這個(gè)簡單的 Makefile ,大家是不是已經(jīng)可以感覺到 make 工具的方便快捷了!
結(jié)語
本文向大家介紹了一下 Linux 編程時(shí)候使用的 make 工具,如何在沒有 IDE 工具的 Linux 環(huán)境下高效快捷的編譯工程,就靠 make 工具了。
當(dāng)然,我們的重點(diǎn)在于 Makefile,對(duì)于 Makefile 的寫法規(guī)則,更多的內(nèi)容我會(huì)單獨(dú)寫文章說明的。
對(duì)于入門的小伙伴來說,也沒有必要一蹴而就,寫好 Makefile 固然重要,但是對(duì)于現(xiàn)在一般的應(yīng)用開發(fā)來說,Makefile 要完全自己從頭寫得時(shí)候不多,很多時(shí)候可以找到一個(gè)可用的模板進(jìn)行修改,我們至少要做到可以看懂,可以去修改 Makefile!
-
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209327 -
編程
+關(guān)注
關(guān)注
88文章
3614瀏覽量
93686 -
編譯器
+關(guān)注
關(guān)注
1文章
1623瀏覽量
49108
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論