一、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è)簡(jiǎn)單的例子,我們寫(xiě)了三個(gè).c 文件,內(nèi)容如下:
編譯的方式如下圖:
這么看起來(lái)是不是感覺(jué)還算簡(jiǎn)單?但是我們可以試想一下,以后做項(xiàng)目的時(shí)候,成千上萬(wàn)個(gè)文件,怎么辦?
我們要考慮2個(gè)主要問(wèn)題:
1、 文件數(shù)量多起來(lái)了以后如何處理?
2、只修改了單個(gè)文件,如何只重新編譯修改過(guò)后的單個(gè)文件?
我們不可能和上面示例一樣手動(dòng)使用 gcc 命令輸入文件名的,而且文件多起來(lái)了,編譯時(shí)間需要很長(zhǎng),使用上面示例的命令,是會(huì)把所有的文件都重新編譯,在后面的 linux 學(xué)習(xí)開(kāi)發(fā)中,項(xiàng)目的編譯時(shí)間可比學(xué)習(xí) 51 、STM32 哪些工程的時(shí)候多得太多,每次都編譯所有文件這種行為肯定是不可取的。
在 Windows 下面我們有各種集成的 IDE 工具,往往只需要一個(gè)按鈕,就可以編譯整個(gè)工程,方便快捷,比如我們熟悉的 Keil,我們只需要點(diǎn)擊 IDE 工具欄目的一個(gè)按鈕,就可以完成我們想要的操作:
那么在 Linux 下,我們?cè)撊绾翁幚砟兀?/p>
這就要用到本文主要說(shuō)明的東西:Make 工具 和 Makefile 。
二、make 工具和 Makefile
首先我們要知道什么是 Make 工具,以及 什么 是 Makefile。
這部分的內(nèi)容時(shí)基本概念,類(lèi)似名詞解釋?zhuān)蠹矣涀【秃茫瑳](méi)有什么特別需要說(shuō)明的,因?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)完成編譯工作,而且可以有效的處理我們上面提到的問(wèn)題:
- 多個(gè)文件的自動(dòng)編譯;
- 每次執(zhí)行 make 命令,只重新編譯修改后的文件;. 這里提一句,Linux 是如何判斷文件是否有修改:文件的修改時(shí)間!就是通過(guò)
ls -l
查看的那個(gè)時(shí)間,make 會(huì)根據(jù)依賴(lài)關(guān)系,如果發(fā)現(xiàn)依賴(lài)的文件修改時(shí)間比自己新,那么久會(huì)重新編譯一下這個(gè)依賴(lài)文件)
利用 make 工具可以將大型的開(kāi)發(fā)項(xiàng)目分解成為多個(gè)更易于管理的模塊,可以簡(jiǎn)潔明快地理順各個(gè)源文件之間紛繁復(fù)雜的相互關(guān)系,大大簡(jiǎn)化開(kāi)發(fā)工作,避免不必要的重新編譯 。
make工具通過(guò)一個(gè)稱(chēng)為 Makefile 的文件來(lái)完成并自動(dòng)維護(hù)編譯工作,Makefile文件描述了整個(gè)工程的編譯、連接規(guī)則。
Makefile 文件:
Makefile 是一個(gè)文件,是一個(gè)描述一系列規(guī)則的文件。
Makefile 的 開(kāi)頭 M 要大寫(xiě)!(雖然有的地方說(shuō)大小寫(xiě)都可以,但是保證大寫(xiě),是肯定不會(huì)有莫名其妙的問(wèn)題的)。
make 會(huì)根據(jù) Makefile 文件的規(guī)則規(guī)則執(zhí)行命令,最后完成編譯輸出 。
在 Makefile 文件中:
- 定義一系列的規(guī)則來(lái)制定源文件編譯后的先后順序
- 特定的語(yǔ)法規(guī)則、支持函數(shù)定義、函數(shù)調(diào)用
- 能直接集成操作系統(tǒng)中的命令
這是我們學(xué)習(xí) Linux 的一個(gè)重點(diǎn)對(duì)象,對(duì)于新手來(lái)說(shuō),至少要做到能夠看得懂,會(huì)一定程度的修改 Makefile 。
2.2 通過(guò) STM32 提前熟悉 Makefile
實(shí)際上 STM32 的開(kāi)發(fā),我們也可以用到 Make 工具和 Makefile,如果大家目前也在用 STM32 開(kāi)發(fā),不妨使用 GCC 工具鏈開(kāi)發(fā),這樣也能提前熟悉 Makefile 。
如果是我的粉絲朋友,一定知道現(xiàn)在我做 STM32 都是使用的 gcc 工具鏈,具體可查看文章:
拋棄IDE — 在window下使用VScode搭建ARM開(kāi)發(fā)環(huán)境
如果想看看簡(jiǎn)單的 Makefile ,大家可以寫(xiě)一個(gè)簡(jiǎn)單的 STM32 工程,然后在 STM32CubeMX 生成工程的時(shí)候選擇 Makefile ,如下圖:
然后打開(kāi)工程,就可以看看 ST 工具自動(dòng)生成的 Makefile 文件了,可以讓自己提前熟悉熟悉 Makefile:
2.3 GCC 與 make 的關(guān)系/區(qū)別?
經(jīng)常有小伙伴會(huì)被 GCC 與 make 工具搞得糊里糊涂,雖然知道怎么用,但是傻傻分不清楚或者是說(shuō)不明白。
看清楚概念:GCC 是編譯器,make 是一個(gè)命令工具。
感覺(jué)把概念一說(shuō)就清楚了啊, GCC 是一個(gè)編譯 C語(yǔ)言的編譯器, 而 make 是一個(gè)工具,他可以使得編譯工作簡(jiǎn)化,只不過(guò)我們使用的時(shí)候 make 會(huì)調(diào)用 GCC 編譯器去完成編譯工作。
在 Makefile 中我們會(huì)指定執(zhí)行編譯的編譯器類(lèi)型,而且會(huì)根據(jù)指定的編譯器類(lèi)型進(jìn)行對(duì)應(yīng)的命令操作,如下圖:
因?yàn)槲覀冊(cè)?linux 下使用的都是 gcc 編譯器,所以 Makefile 中的會(huì)看到我們熟悉的 gcc 的操作命令,我們只不過(guò)是利用 make 工具的自動(dòng)編譯去調(diào)用了 gcc 編譯器 對(duì)工程進(jìn)行編譯。
三、一個(gè)簡(jiǎn)單的 Makefile
上面說(shuō)過(guò),Makefile 是學(xué)習(xí) Linux 的一個(gè)要點(diǎn)之一,對(duì)于 Makefile 說(shuō)明,我會(huì)單獨(dú)分專(zhuān)欄進(jìn)行說(shuō)明介紹,那本文我們剛剛接觸,我們寫(xiě)一個(gè)簡(jiǎn)單的 Makefile 來(lái)編譯文章開(kāi)頭我們示例的3個(gè)文件。
直接先寫(xiě)一個(gè)傻瓜式的,看看 make 工具是否有用,在示例 .c 文件同目錄下,我們新建一個(gè) Makefile 文件,如下:
然后試著使用 make 命令看看效果:
OK,果然可以 make 直接編譯,但是上面這個(gè) Makefile 是有問(wèn)題的,因?yàn)槊看螆?zhí)行 make ,會(huì)把所有的 .c 文件都重新編譯器一次,實(shí)際使用也不可能這么寫(xiě)。
我們回憶一下上一篇課程的內(nèi)容,一個(gè)C 文件要經(jīng)過(guò)預(yù)處理、編譯、匯編 和 鏈接才能變成可執(zhí)行文件,由不同的 .c
文件生成到不同的 .o
文件,最終才將所有的 .o
文件鏈接成可執(zhí)行文件。
所以我們可分開(kāi)進(jìn)行,把每一個(gè) .c
先生成 .o
文件,然后再由 所有的 .o
文件生成 最終的文件,這樣如果單獨(dú)修改了某個(gè)文件 ,只需要把修改過(guò)的 .c
文件重新編譯就行了,所以我們的 Makefile 應(yīng)該這么寫(xiě):
make 的結(jié)果如下:
這樣寫(xiě)得好處就是,如果我們只對(duì)某一個(gè).c
文件進(jìn)行修改,他只會(huì)對(duì)修改過(guò)的文件進(jìn)行重新編譯,我們可以測(cè)試一下,比如我們修改一下 a.c
文件:
上面這個(gè)簡(jiǎn)單的 Makefile ,大家是不是已經(jīng)可以感覺(jué)到 make 工具的方便快捷了!
結(jié)語(yǔ)
本文向大家介紹了一下 Linux 編程時(shí)候使用的 make 工具,如何在沒(méi)有 IDE 工具的 Linux 環(huán)境下高效快捷的編譯工程,就靠 make 工具了。
當(dāng)然,我們的重點(diǎn)在于 Makefile,對(duì)于 Makefile 的寫(xiě)法規(guī)則,更多的內(nèi)容我會(huì)單獨(dú)寫(xiě)文章說(shuō)明的。
對(duì)于入門(mén)的小伙伴來(lái)說(shuō),也沒(méi)有必要一蹴而就,寫(xiě)好 Makefile 固然重要,但是對(duì)于現(xiàn)在一般的應(yīng)用開(kāi)發(fā)來(lái)說(shuō),Makefile 要完全自己從頭寫(xiě)得時(shí)候不多,很多時(shí)候可以找到一個(gè)可用的模板進(jìn)行修改,我們至少要做到可以看懂,可以去修改 Makefile!
-
Linux
+關(guān)注
關(guān)注
87文章
11225瀏覽量
208911 -
GCC
+關(guān)注
關(guān)注
0文章
105瀏覽量
24820 -
文件
+關(guān)注
關(guān)注
1文章
561瀏覽量
24695 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4304瀏覽量
62427 -
編譯
+關(guān)注
關(guān)注
0文章
653瀏覽量
32806
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論