《跟我一起写Makefile》读书笔记(1)
生活随笔
收集整理的這篇文章主要介紹了
《跟我一起写Makefile》读书笔记(1)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
以下內(nèi)容源于陳皓所寫《跟我一起寫Makefile》的學(xué)習(xí)和整理,如有侵權(quán),請(qǐng)告知?jiǎng)h除。
一、概述
(1)makefile的作用,類似于windows中的IDE工具的功能;
(2)makefile 關(guān)系到整個(gè)工程的編譯規(guī)則
- 定義了一系列的規(guī)則來(lái)指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯。
- 甚至于進(jìn)行更復(fù)雜的功能操作,因?yàn)?span id="ze8trgl8bvbq" class="fontstyle0">makefile 就像一個(gè) Shell 腳本一樣,其中也可以執(zhí)行操作系統(tǒng)的命令。
- 一旦寫好,只需要一個(gè) make 命令,整個(gè)工程完全自動(dòng)編譯,極大的提高了軟件開發(fā)的效率。
二、關(guān)于程序的編譯和連接
(1)源文件經(jīng)過(guò)編譯器的編譯,生成中間目標(biāo)文件(.o文件,即Object File)
- 在編譯時(shí),編譯器只檢測(cè)程序語(yǔ)法,和函數(shù)、變量是否被聲明。如果函數(shù)未被聲明,編譯器會(huì)給出一個(gè)警告,但可以生成 Object File。
- 一般來(lái)說(shuō),每個(gè)源文件都應(yīng)該對(duì)應(yīng)于一個(gè)中間目標(biāo)文件(O 文件或是 OBJ 文件)。
- 鏈接時(shí),主要是鏈接函數(shù)和全局變量?。
- 由于源文件太多,編譯生成的中間目標(biāo)文件太多,而在鏈接時(shí)需要明顯地指出中間目標(biāo)文件名,這對(duì)于編譯很不方便,所以,我們要給中間目標(biāo)文件打個(gè)包,在 Windows 下這種包叫“庫(kù)文件”(Library File),也就是 .lib 文件,在 UNIX下,是 Archive File,也就是 .a 文件。
(3)由.elf文件得到可以燒寫的鏡像文件
- 鏈接器所得到.elf文件是可執(zhí)行程序(在操作系統(tǒng)下,此.el文件可以執(zhí)行);
- 但在嵌入式裸機(jī)中,我們需要的是可以燒寫的文件(可燒寫的文件就叫鏡像image);
- 因此我們需要用這個(gè).elf為原材料來(lái)制作鏡像,制作工具是交叉編譯工具鏈中的arm-linux-objcopy。
- 使用arm-linux-objdump工具進(jìn)行反編譯(反匯編);
- 把編譯后的.elf格式的可執(zhí)行程序反編譯,得到它的匯編源代碼。
- 我們使用反匯編主要是用來(lái)學(xué)習(xí)。
(4)Makefile文件中把編譯和鏈接的過(guò)程分開。
- 用gcc a.c -o exe這種方式來(lái)編譯時(shí),形式上把編譯和鏈接過(guò)程一步完成了。
- 但是在內(nèi)部實(shí)際上編譯和鏈接永遠(yuǎn)是分開獨(dú)立進(jìn)行的,編譯要使用編譯器gcc,鏈接要使用鏈接器ld。
三、Makefile的介紹
1、makefile的規(guī)則
target ... : prerequisites ... command(1)如果prerequisites中有一個(gè)以上的文件比 target 文件要新的話,command 所定義的命令就會(huì)被執(zhí)行。這就是 Makefile 的規(guī)則。也就是 Makefile 中最核心的內(nèi)容。
(2)命令前一定要以一個(gè) Tab 鍵作為開頭。
(3)“目標(biāo):”后面如果沒(méi)有依賴
- 那么,make 就不會(huì)自動(dòng)去找文件的依賴性,也就不會(huì)自動(dòng)執(zhí)行其后所定義的命令。
- 要執(zhí)行其后的命令,就要在 make 命令后明顯得指出這個(gè)lable 的名字。
- 這樣的方法非常有用,我們可以在一個(gè) makefile 中定義不用的編譯或是和編譯無(wú)關(guān)的命令,比如程序的打包,程序的備份,等等。
2、makefile是如何工作的?
- make 會(huì)一層又一層地去找文件的依賴關(guān)系,直到最終編譯出第一個(gè)目標(biāo)文件。
- 在找尋的過(guò)程中,如果出現(xiàn)錯(cuò)誤,比如最后被依賴的文件找不到,那么make 就會(huì)直接退出,并報(bào)錯(cuò);
- 對(duì)于所定義的命令的錯(cuò)誤,或是編譯不成功,make 根本不理。
3、makefile中使用變量
這類似于shell中定義變量,然后使用$來(lái)引用
4、makefile的自動(dòng)推導(dǎo)
.PHONY修飾clean,表示clean是一個(gè)偽目標(biāo)
5、清空目標(biāo)文件的規(guī)則
如上,每個(gè)Makefile中都應(yīng)該寫一個(gè)清空目標(biāo)文件(.o 和執(zhí)行文件)的規(guī)則,這不僅便于重編譯,也很利于保持文件的清潔
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔為你收集整理的《跟我一起写Makefile》读书笔记(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网易云音乐 linux x32,网易云音
- 下一篇: C++ plus Primer 第六版中