最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

9.5Makefile的引入及規(guī)則

2020-08-18 12:40 作者:韋東山  | 我要投稿


視頻教程???

韋東山升級版全系列嵌入式免費視頻_快速入門篇


使用keil, mdk, avr等工具開發(fā)程序時點擊鼠標(biāo)就可以編譯了,它的內(nèi)部機制是什么?它怎么組織管理程序?怎么決定編譯哪一個文件?

答:實際上windows工具管理程序的內(nèi)部機制,也是Makefile,我們在linux下來開發(fā)裸板程序的時候,使用Makefile組織管理這些程序,本節(jié)我們來講解Makefile最基本的規(guī)則。Makefile要做什么事情呢? 組織管理程序,組織管理文件,我們寫一個程序來實驗一下:

文件a.c?

文件b.c?


編譯:

gcc -o test a.c b.c

運行:

./test

結(jié)果:

This is B

gcc -o test a.c b.c這條命令雖然簡單,但是它完成的功能不簡單。 我們來看看它做了哪些事情。

我們知道.c程序 --> 得到可執(zhí)行程序

它們之間要經(jīng)過四個步驟:

1.預(yù)處理

2.編譯

3.匯編

4.鏈接


我們經(jīng)常把前三個步驟統(tǒng)稱為編譯了。我們具體分析:gcc -o test a.c b.c這條命令 它們要經(jīng)過下面幾個步驟:

1).對于a.c執(zhí)行:預(yù)處理 編譯 匯編 的過程,a.c -->xxx.s ?-->xxx.o 文件。

2).對于b.c執(zhí)行:預(yù)處理 編譯 匯編 的過程,b.c -->yyy.s ?-->yyy.o 文件。

3).最后:xxx.o和yyy.o鏈接在一起得到一個test應(yīng)用程序。

提示:gcc -o test a.c b.c -v ?:加上一個‘-v’選項可以看到它們的處理過程,

第一次編譯a.c得到xxx.o文件,這是很合乎情理的, 執(zhí)行完第一次之后,如果修改a.c 又再次執(zhí)行:gcc -o test a.c b.c,對于a.c應(yīng)該重新生成xxx.o,但是對于b.c又會重新編譯一次,這完全沒有必要,b.c根本沒有修改,直接使用第一次生成的yyy.o文件就可以了。

缺點

對所有的文件都會再處理一次,即使b.c沒有經(jīng)過修改,b.c也會重新編譯一次, 當(dāng)文件比較少時,這沒有沒有什么問題,當(dāng)文件非常多的時候,就會帶來非常多的效率問題。

如果文件非常多的時候,我們,只是修改了一個文件,所用的文件就會重新處理一次,編譯的時候就會等待很長時間。

對于這些源文件,我們應(yīng)該分別處理,執(zhí)行:預(yù)處理 編譯 匯編 ,先分別編譯它們,最后再把它們鏈接在一次,比如:


編譯:

gcc -o a.o a.c?

gcc -o b.o b.c


鏈接:

gcc -o test a.o b.o


比如:上面的例子,當(dāng)我們修改a.c之后,a.c會重現(xiàn)編譯然后再把它們鏈接在一起就可以了。,b.c 就不需要重新編譯。

那么問題又來了,怎么知道哪些文件被更新了/被修改了?

比較時間:比較a.o和a.c的時間,如果a.c的時間比a.o的時間更加新的話,就表明a.c被修改了,同理b.o和b.c也會進行同樣的比較。比較test和a.o, b.o的時間,如果a.o或者b.o的時間比test更加新的話,就表明應(yīng)該重新生成test。Makefile 就是這樣做的。

我們現(xiàn)在來寫出一個簡單的Makefile: makefie最基本的語法是規(guī)則,規(guī)則:

目標(biāo)?: ? 依賴1 ? 依賴2 ?...?

[TAB]命令


當(dāng)“依賴”比“目標(biāo)”新,執(zhí)行它們下面的命令。我們要把上面三個命令寫成makefile規(guī)則,如下:

test :a.o b.o ?//test是目標(biāo),它依賴于a.o b.o文件,一旦a.o或者b.o比test新的時候,


就需要執(zhí)行下面的命令,重新生成test可執(zhí)行程序。?

我們來作一下實驗:

在改目錄下我們寫一個Makefile文件:

文件:Makefile?

上面是makefile中的三條規(guī)則。makefile,就是名字為“makefile”的文件。當(dāng)我們想編譯程序時,直接執(zhí)行make命令就可以了,一執(zhí)行make命令它想生成第一個目標(biāo)test可執(zhí)行程序, 如果發(fā)現(xiàn)a.o 或者b.o沒有,就要先生成a.o或者b.o,發(fā)現(xiàn)a.o依賴a.c,有a.c

但是沒有a.o,他就會認為a.c比a.o新,就會執(zhí)行它們下面的命令來生成a.o,同理b.o和b.c的處理關(guān)系也是這樣的。

如果修改a.c ,我們再次執(zhí)行make,它的本意是想生成第一個目標(biāo)test應(yīng)用程序,

它需要先生成a.o, 發(fā)現(xiàn)a.o依賴a.c(執(zhí)行我們修改了a.c)發(fā)現(xiàn)a.c比a.o更加新,就會執(zhí)行gcc -c -o a.o a.c命令來生成a.o文件。b.o依賴b.c,發(fā)現(xiàn)b.c并沒有修改,就不會執(zhí)行gcc -c -o b.o b.c來重新生成b.o文件。現(xiàn)在a.o b.o都有了,其中的a.o比test更加新,就會執(zhí)行gcc -o test a.o b.o來重新鏈接得到test可執(zhí)行程序。所以當(dāng)執(zhí)行make命令時候就會執(zhí)行下面兩條執(zhí)行:?

gcc -c -o a.o a.c?

gcc -o test a.o b.o


我們第一次執(zhí)行make的時候,會執(zhí)行下面三條命令(三條命令都執(zhí)行): gcc -c -o a.o a.c gcc -c -o b.o b.c gcc -o test a.o b.o


再次執(zhí)行make 就會顯示下面的提示:?

make: `test' is up to date.


我們再次執(zhí)行make 就會判斷Makefile文件中的依賴,發(fā)現(xiàn)依賴沒有更新,所以目標(biāo)文件就不會重現(xiàn)生成,就會有上面的提示。當(dāng)我們修改a.c后,重新執(zhí)行make,

就會執(zhí)行下面兩條指令:

gcc -c -o a.o a.c?

gcc -o test a.o b.o


我們同時修改a.c b.c,執(zhí)行make就會執(zhí)行下面三條指令。

gcc -c -o a.o a.c?

gcc -c -o b.o b.c?

gcc -o test a.o b.o


a.c文件修改了,重新編譯生成a.o, b.c修改了重新編譯生成b.o,a.o, b.o都更新了重新鏈接生成test可執(zhí)行程序,makefile的規(guī)則其實還是比較簡單的。

規(guī)則是Makefie的核心,執(zhí)行make命令的時候,就會在當(dāng)前目錄下面找到名字為:Makefile的文件,根據(jù)里面的內(nèi)容來執(zhí)行里面的判斷/命令。?


視頻教程???

https://www.bilibili.com/video/BV1w4411B7a4?p=48





9.5Makefile的引入及規(guī)則的評論 (共 條)

分享到微博請遵守國家法律
那坡县| 调兵山市| 澄迈县| 甘洛县| 大邑县| 茂名市| 天祝| 凯里市| 海丰县| 谷城县| 涡阳县| 普兰店市| 建始县| 鸡西市| 宽城| 南漳县| 墨脱县| 鄂州市| 策勒县| 武功县| 武夷山市| 汽车| 上饶市| 塔城市| 乐平市| 开封市| 葵青区| 宿州市| 疏附县| 东阳市| 德阳市| 手游| 石城县| 札达县| 怀安县| 仙桃市| 兴仁县| 策勒县| 巴塘县| 大同市| 靖宇县|